Android - How to renderer video texture on 3D cube with opengl-es?

Astril

I draw a 3D cube by using opengl-es

https://db.tt/ktcbwtnD //this is the picture, because I'm new in stackoverflow so i cant paste picture

and I also renderer video by reference this code

public class VideoTextureRender implements Renderer, SurfaceTexture.OnFrameAvailableListener {
        private static String TAG = "VideoRender";

        private static final int FLOAT_SIZE_BYTES = 4;
        public static final int BYTES_PER_FLOAT = 4;
        private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
        private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0;
        private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3;
        private static int count = 1;
        private final float[] mTriangleVerticesData = {
            // X, Y, Z, U, V
            -0.5f, -0.5f, 0, 0.f, 0.f,
            0.5f, -0.5f, 0, 1.f, 0.f,
            -0.5f,  0.5f, 0, 0.f, 1.f,
            0.5f,  0.5f, 0, 1.f, 1.f,

        };


        private FloatBuffer mTriangleVertices;

        private final String mVertexShader =
                "uniform mat4 uMVPMatrix;\n" +
                "uniform mat4 uSTMatrix;\n" +
                "attribute vec4 aPosition;\n" +
                "attribute vec4 aTextureCoord;\n" +
                "varying vec2 vTextureCoord;\n" +
                "void main() {\n" +
                "  gl_Position = uMVPMatrix * aPosition;\n" +
                "  vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
                "}\n";

        private final String mFragmentShader =
                "#extension GL_OES_EGL_image_external : require\n" +
                "precision mediump float;\n" +
                "varying vec2 vTextureCoord;\n" +
                "uniform samplerExternalOES sTexture;\n" +
                "void main() {\n" +
                "  gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
                "}\n";

        private float[] mMVPMatrix = new float[16];
        private float[] mSTMatrix = new float[16];

        private int mProgram;
        private int mTextureID;
        private int muMVPMatrixHandle;
        private int muSTMatrixHandle;
        private int maPositionHandle;
        private int maTextureHandle;

        private GLSurfaceViewActivity mGLSurfaceViewActivity;
        private SurfaceTexture mSurface;
        private boolean updateSurface = false;

        public static int GL_TEXTURE_EXTERNAL_OES = 0x8D65;

        private MediaPlayer mMediaPlayer;
        private Context context;

        public VideoTextureRender(Context Context) {
            mTriangleVertices = ByteBuffer.allocateDirect(
                    mTriangleVerticesData.length * FLOAT_SIZE_BYTES)
                        .order(ByteOrder.nativeOrder()).asFloatBuffer();
            mTriangleVertices.put(mTriangleVerticesData).position(0);

            Matrix.setIdentityM(mSTMatrix, 0);
        }

        public void setMediaPlayer(MediaPlayer player) {
            mMediaPlayer = player;
        }


        @Override
        public void onDrawFrame(GL10 glUnused) {

             synchronized(this) {
                    if (updateSurface) {
                        mSurface.updateTexImage();
                        mSurface.getTransformMatrix(mSTMatrix);
                        updateSurface = false;
                    }
                }


            GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

            GLES20.glUseProgram(mProgram);
            checkGlError("glUseProgram");

            GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
            GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);

            mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
            GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
                TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
            checkGlError("glVertexAttribPointer maPosition");
            GLES20.glEnableVertexAttribArray(maPositionHandle);
            checkGlError("glEnableVertexAttribArray maPositionHandle");

            mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
            GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false,
                TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
            checkGlError("glVertexAttribPointer maTextureHandle");
            GLES20.glEnableVertexAttribArray(maTextureHandle);
            checkGlError("glEnableVertexAttribArray maTextureHandle");

            Matrix.setIdentityM(mMVPMatrix, 0);

            //rotateM(mSTMatrix, 0, count, 1f, 1f, 0f);

            GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
            GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);

            GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
            checkGlError("glDrawArrays");
            GLES20.glFinish();

        }

        @Override
        public void onSurfaceChanged(GL10 glUnused, int width, int height) {

        }

        @Override
        public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {

            mProgram = createProgram(mVertexShader, mFragmentShader);
            if (mProgram == 0) {
                return;
            }
            maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
            checkGlError("glGetAttribLocation aPosition");
            if (maPositionHandle == -1) {
                throw new RuntimeException("Could not get attrib location for aPosition");
            }
            maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord");
            checkGlError("glGetAttribLocation aTextureCoord");
            if (maTextureHandle == -1) {
                throw new RuntimeException("Could not get attrib location for aTextureCoord");
            }

            muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
            checkGlError("glGetUniformLocation uMVPMatrix");
            if (muMVPMatrixHandle == -1) {
                throw new RuntimeException("Could not get attrib location for uMVPMatrix");
            }

            muSTMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uSTMatrix");
            checkGlError("glGetUniformLocation uSTMatrix");
            if (muSTMatrixHandle == -1) {
                throw new RuntimeException("Could not get attrib location for uSTMatrix");
            }


            int[] textures = new int[1];
            GLES20.glGenTextures(1, textures, 0);

            mTextureID = textures[0];
            GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);
            checkGlError("glBindTexture mTextureID");

            GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,
                                   GLES20.GL_NEAREST);
            GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,
                                   GLES20.GL_LINEAR);

            mSurface = new SurfaceTexture(mTextureID);
                mSurface.setOnFrameAvailableListener(this);

                Surface surface = new Surface(mSurface);

                    mMediaPlayer.setSurface(surface);
                    mMediaPlayer.setScreenOnWhilePlaying(true);
                    surface.release();

                try {
                    mMediaPlayer.prepare();
                } catch (IOException t) {
                    Log.e(TAG, "media player prepare failed");

                    synchronized(this) {
                        updateSurface = false;
                    }           
                }

                mMediaPlayer.start();


        }

        synchronized public void onFrameAvailable(SurfaceTexture surface) {
            updateSurface = true;
        }

        private int loadShader(int shaderType, String source) {
            int shader = GLES20.glCreateShader(shaderType);
            if (shader != 0) {
                GLES20.glShaderSource(shader, source);
                GLES20.glCompileShader(shader);
                int[] compiled = new int[1];
                GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
                if (compiled[0] == 0) {
                    Log.e(TAG, "Could not compile shader " + shaderType + ":");
                    Log.e(TAG, GLES20.glGetShaderInfoLog(shader));
                    GLES20.glDeleteShader(shader);
                    shader = 0;
                }
            }
            return shader;
        }

        private int createProgram(String vertexSource, String fragmentSource) {
            int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
            if (vertexShader == 0) {
                return 0;
            }
            int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
            if (pixelShader == 0) {
                return 0;
            }

            int program = GLES20.glCreateProgram();
            if (program != 0) {
                GLES20.glAttachShader(program, vertexShader);
                checkGlError("glAttachShader");
                GLES20.glAttachShader(program, pixelShader);
                checkGlError("glAttachShader");
                GLES20.glLinkProgram(program);
                int[] linkStatus = new int[1];
                GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
                if (linkStatus[0] != GLES20.GL_TRUE) {
                    Log.e(TAG, "Could not link program: ");
                    Log.e(TAG, GLES20.glGetProgramInfoLog(program));
                    GLES20.glDeleteProgram(program);
                    program = 0;
                }
            }
            return program;
        }

        private void checkGlError(String op) {
            int error;
            while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
                Log.e(TAG, op + ": glError " + error);
                throw new RuntimeException(op + ": glError " + error);
            }
        }
}

https://db.tt/rDjbtYjE

My problem is how to set video as a texture and bind video texture on cube ?

Thank You!

ClayMontgomery

Using video with OpenGL ES is more complex than you probably expect. The key issues are:

  1. Video frames must be converted from YUV to RGB color space. This is best done in 2.0 or 3.0 GLSL shader code or using external textures.

  2. The glTexImage2D() function is too slow to handle HD video frame rates because it copies the data. Use the EGL Image Extension instead named EGL_NATIVE_BUFFER_ANDROID.

  3. The decoding of video frames must be synchronized with OpenGL ES's texture loading. This can be done with the fence sync extensions.

This answer has some links with further information to get you started.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Creating 3D cube using Android OpenGL ES 2.0

From Dev

How to render to a depth texture in OpenGL ES on Android

From Dev

How to Load a 3D Object in OpenGL ES 2.0 for Android?

From Dev

how to load android camera frame into opengl es texture via ndk?

From Dev

how to load android camera frame into opengl es texture via ndk?

From Dev

how to assign one texture to another efficiently in OpenGL ES for Android

From Dev

How to check an uploaded texture in OpenGL ES 2.0 in Android?

From Dev

How to apply a texture on a 3D object in OpenGL

From Dev

Cube not drawn in OpenGL ES 3.0 on android

From Dev

Android OpenGL ES 2 Texture Quadrants Rotated

From Dev

Android OpenGL.ES Texture/Image Drawing

From Dev

Drawing cube 3D using Opengl

From Dev

How to add some pixels on the texture in OpenGL ES

From Dev

How to add some pixels on the texture in OpenGL ES

From Dev

OpenGL : Cube Map texture, no UV mapping

From Dev

Android OpenGL: How to change bitmap attached to texture?

From Dev

Android OpenGL ES 2.0 - Cannot see 3D Obect

From Dev

Labeling parts of 3D model with Android and OpenGL ES/Rajawali

From Dev

OpenGL ES: Texture a plane

From Dev

How to draw a cube in OpenGL?

From Dev

how can i project a camera onto a cube as a Texture in jMonkeyEngine 3?

From Dev

android opengl texture overlapping

From Dev

Android Opengl Circle Texture

From Dev

How to create a VAO in openGL ES 3 android

From Dev

Android drawing texture with OpenGL ES 2.0 slow on some devices

From Dev

Texture compression strategy for Android OpenGL ES that caters for alphas

From Dev

Android OpenGL ES 2.0 Texture setting does not seem to work

From Dev

Android drawing texture with OpenGL ES 2.0 slow on some devices

From Dev

Texture compression strategy for Android OpenGL ES that caters for alphas

Related Related

  1. 1

    Creating 3D cube using Android OpenGL ES 2.0

  2. 2

    How to render to a depth texture in OpenGL ES on Android

  3. 3

    How to Load a 3D Object in OpenGL ES 2.0 for Android?

  4. 4

    how to load android camera frame into opengl es texture via ndk?

  5. 5

    how to load android camera frame into opengl es texture via ndk?

  6. 6

    how to assign one texture to another efficiently in OpenGL ES for Android

  7. 7

    How to check an uploaded texture in OpenGL ES 2.0 in Android?

  8. 8

    How to apply a texture on a 3D object in OpenGL

  9. 9

    Cube not drawn in OpenGL ES 3.0 on android

  10. 10

    Android OpenGL ES 2 Texture Quadrants Rotated

  11. 11

    Android OpenGL.ES Texture/Image Drawing

  12. 12

    Drawing cube 3D using Opengl

  13. 13

    How to add some pixels on the texture in OpenGL ES

  14. 14

    How to add some pixels on the texture in OpenGL ES

  15. 15

    OpenGL : Cube Map texture, no UV mapping

  16. 16

    Android OpenGL: How to change bitmap attached to texture?

  17. 17

    Android OpenGL ES 2.0 - Cannot see 3D Obect

  18. 18

    Labeling parts of 3D model with Android and OpenGL ES/Rajawali

  19. 19

    OpenGL ES: Texture a plane

  20. 20

    How to draw a cube in OpenGL?

  21. 21

    how can i project a camera onto a cube as a Texture in jMonkeyEngine 3?

  22. 22

    android opengl texture overlapping

  23. 23

    Android Opengl Circle Texture

  24. 24

    How to create a VAO in openGL ES 3 android

  25. 25

    Android drawing texture with OpenGL ES 2.0 slow on some devices

  26. 26

    Texture compression strategy for Android OpenGL ES that caters for alphas

  27. 27

    Android OpenGL ES 2.0 Texture setting does not seem to work

  28. 28

    Android drawing texture with OpenGL ES 2.0 slow on some devices

  29. 29

    Texture compression strategy for Android OpenGL ES that caters for alphas

HotTag

Archive