0

I try to display a texture on OpenGLES 3.0 but I can see any image from it.

The GLRenderer is :

public class CameraGLRenderer  implements GLSurfaceView.Renderer{

    public static final String TAG = "com.example.CameraGLRenderer";

    private CameraImage mCameraImage;

    public CameraGLRenderer(int width, int heigh) {
        mCameraImage = new CameraImage(width,heigh);
    }

    @Override
    public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
        // Set the background frame color
        GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    }

    @Override
    public void onSurfaceChanged(GL10 gl10, int width, int height) {
        // Adjust the viewport based on geometry changes,
        // such as screen rotation
        GLES30.glActiveTexture(GLES30.GL_ACTIVE_TEXTURE);
        GLES30.glViewport(0, 0, width, height);

//        float ratio = (float) width / height;
//
//        // this projection matrix is applied to object coordinates
//        // in the onDrawFrame() method
//        Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

    }

    @Override
    public void onDrawFrame(GL10 gl10) {
        mCameraImage.draw();
    }



    public static int loadShader(int type, String shaderCode){

        // create a vertex shader type (GLES30.GL_VERTEX_SHADER)
        // or a fragment shader type (GLES30.GL_FRAGMENT_SHADER)
        int shader = GLES30.glCreateShader(type);

        // add the source code to the shader and compile it
        GLES30.glShaderSource(shader, shaderCode);
        GLES30.glCompileShader(shader);

        return shader;
    }


    public static void checkGlError(String glOperation) {
        int error;
        while ((error = GLES30.glGetError()) != GLES30.GL_NO_ERROR) {
            Log.e(TAG, glOperation + ": glError " + error);
            throw new RuntimeException(glOperation + ": glError " + error);
        }
    }

    public void onPreviewFrame(byte[] data) {
        mCameraImage.onPreviewFrame(data);
    }

}

And my camera image class:

    public CameraImage(int width,int height) {

     Log.d(TAG,"CameraImage constructor");
        mWidth = width;
        mHeight = height;

        U_INDEX = width*height;
        V_INDEX = width*height*5/4;
        LENGTH = width*height;
        LENGTH_4 = width*height/4;

        yData = new byte[LENGTH];
        uData = new byte[LENGTH_4];
        vData = new byte[LENGTH_4];

        yBuffer = ByteBuffer.allocate(LENGTH);
        uBuffer = ByteBuffer.allocate(LENGTH_4);
        vBuffer = ByteBuffer.allocate(LENGTH_4);

        mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
        mVertices.put(mVerticesData).position(0);

        mIndices = ByteBuffer.allocateDirect(mIndicesData.length * 2)
                .order(ByteOrder.nativeOrder()).asShortBuffer();
        mIndices.put(mIndicesData).position(0);


        // prepare shaders and OpenGL program
        int vertexShader = CameraGLRenderer.loadShader(
                GLES30.GL_VERTEX_SHADER,
                vertexShaderCode);
        int fragmentShader = CameraGLRenderer.loadShader(
                GLES30.GL_FRAGMENT_SHADER,
                fragmentShaderCode);

        mProgram = GLES30.glCreateProgram();             // create empty OpenGL Program
        GLES30.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program
        CameraGLRenderer.checkGlError("glAttachShader");
        GLES30.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
        CameraGLRenderer.checkGlError("glAttachShader");
        GLES30.glLinkProgram(mProgram);                  // create OpenGL program executables


        CameraGLRenderer.checkGlError("glLinkProgram");
        // Get the attribute locations
        mPositionLoc = GLES30.glGetAttribLocation(mProgram, "a_position");
        CameraGLRenderer.checkGlError("glGetAttribLocation");
        mTexCoordLoc = GLES30.glGetAttribLocation(mProgram, "a_texCoord");
        CameraGLRenderer.checkGlError("glGetAttribLocation");
        GLES30.glEnable(GLES30.GL_TEXTURE_2D);
        CameraGLRenderer.checkGlError("glEnable");


        yTexture = GLES30.glGetUniformLocation(mProgram, "y_texture");
        CameraGLRenderer.checkGlError("glGetUniformLocation");
        yTextureNames = new int[1];
        GLES30.glGenTextures(1, yTextureNames, 0);
        CameraGLRenderer.checkGlError("glGenTextures");
        int yTextureName = yTextureNames[0];
        GLES30.glActiveTexture(GLES30.GL_TEXTURE1);
        CameraGLRenderer.checkGlError("glActiveTexture");
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, yTextureName);
        CameraGLRenderer.checkGlError("glBindTexture");
        GLES30.glEnable(GLES30.GL_TEXTURE_2D);
        CameraGLRenderer.checkGlError("glEnable");


        uTexture = GLES30.glGetUniformLocation(mProgram, "u_texture");
        CameraGLRenderer.checkGlError("glGetUniformLocation");
        uTextureNames = new int[1];
        GLES30.glGenTextures(1, uTextureNames, 0);
        CameraGLRenderer.checkGlError("glGenTextures");
        int uTextureName = uTextureNames[0];
        GLES30.glActiveTexture(GLES30.GL_TEXTURE2);
        CameraGLRenderer.checkGlError("glActiveTexture");
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, uTextureName);
        CameraGLRenderer.checkGlError("glBindTexture");
        GLES30.glEnable(GLES30.GL_TEXTURE_2D);
        CameraGLRenderer.checkGlError("glBindTexture");


        vTexture = GLES30.glGetUniformLocation(mProgram, "v_texture");
        CameraGLRenderer.checkGlError("glGetUniformLocation");
        vTextureNames = new int[1];
        GLES30.glGenTextures(1, vTextureNames, 0);
        CameraGLRenderer.checkGlError("glGenTextures");
        int vTextureName = vTextureNames[0];
        GLES30.glActiveTexture(GLES30.GL_TEXTURE2);
        CameraGLRenderer.checkGlError("glActiveTexture");
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, vTextureName);
        CameraGLRenderer.checkGlError("glBindTexture");
//
//
//        // Set the background clear color to black.
        GLES30.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
        CameraGLRenderer.checkGlError("glClearColor");

    }


    public void draw() {

        Log.d(TAG, "Draw");
        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
        CameraGLRenderer.checkGlError("glClear"); ///ERROR !!!!

        // Add program to OpenGL environment
        GLES30.glUseProgram(mProgram);
        CameraGLRenderer.checkGlError("glUseProgram");

        // Load the vertex position
        mVertices.position(0);
        GLES30.glVertexAttribPointer(mPositionLoc, 3, GLES30.GL_FLOAT, false, 5*4, mVertices);
        // Load the texture coordinate
        mVertices.position(3);
        GLES30.glVertexAttribPointer(mTexCoordLoc, 2, GLES30.GL_FLOAT, false, 5*4, mVertices);


        // Enable a handle to the triangle vertices
        GLES30.glEnableVertexAttribArray(mPositionLoc);
        GLES30.glEnableVertexAttribArray(mTexCoordLoc);
        CameraGLRenderer.checkGlError("glEnableVertexAttribArray");
        CameraGLRenderer.checkGlError("glEnableVertexAttribArray");



        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, yTextureNames[0]);
        GLES30.glTexImage2D(   GLES30.GL_TEXTURE_2D, 0, GLES30.GL_LUMINANCE,
                1920, 1080, 0, GLES30.GL_LUMINANCE, GLES30.GL_UNSIGNED_BYTE, yBuffer);
        GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE);
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE);
        GLES30.glActiveTexture(GLES30.GL_TEXTURE1+1);
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, yTextureNames[0]);
        GLES30.glUniform1i(yTexture, 1);


        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, uTextureNames[0]);
        GLES30.glTexImage2D(   GLES30.GL_TEXTURE_2D, 0, GLES30.GL_LUMINANCE,
                960, 540, 0, GLES30.GL_LUMINANCE, GLES30.GL_UNSIGNED_BYTE, uBuffer);
        GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE);
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE);
        GLES30.glActiveTexture(GLES30.GL_TEXTURE1+2);
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, uTextureNames[0]);
        GLES30.glUniform1i(uTexture, 2);


        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, vTextureNames[0]);
        GLES30.glTexImage2D(   GLES30.GL_TEXTURE_2D, 0, GLES30.GL_LUMINANCE,
                960, 540, 0, GLES30.GL_LUMINANCE, GLES30.GL_UNSIGNED_BYTE, vBuffer);
        GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE);
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE);
        GLES30.glActiveTexture(GLES30.GL_TEXTURE1+3);
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, vTextureNames[0]);
        GLES30.glUniform1i(vTexture, 3);

        // Draw the square
        GLES30.glDrawElements(
                GLES30.GL_TRIANGLES, mIndicesData.length,
                GLES30.GL_UNSIGNED_SHORT, mVertices);
    }


    public void onPreviewFrame(byte[] data) {

        System.arraycopy(data, 0, yData, 0, LENGTH);
        yBuffer.put(yData);
        yBuffer.position(0);

        System.arraycopy(data, U_INDEX, uData, 0, LENGTH_4);
        uBuffer.put(uData);
        uBuffer.position(0);

        System.arraycopy(data, V_INDEX, vData, 0, LENGTH_4);
        vBuffer.put(vData);
        vBuffer.position(0);
    }


}

The program goes through the draw function of the CameraImage class but the image is still black.

According to the fragmentShaderCode the image should be red but the image are still black.

The program doesn't seem to execute the shader.

Edit: I modify the code according to message you send me. I also add glerror analyse. I get an error on that line :

    Log.d(TAG, "Draw");
    GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
    CameraGLRenderer.checkGlError("glClear"); ///ERROR !!!!

This is the error I get:

08-21 07:12:03.644 6604-6622/com.example E/AndroidRuntime: FATAL EXCEPTION: GLThread 426
    Process: com.example, PID: 6604
    java.lang.RuntimeException: glClear: glError 1282
        at com.example.CameraGLRenderer.checkGlError(CameraGLRenderer.java:90)

Edit2: I mixe the CameraGLRenderer and the CameraImage into one Class MyRenderer I found on stackoverflow:

public class MyRenderer implements GLSurfaceView.Renderer {
    public static final int recWidth = 1920;
    public static final int recHeight = 1080;

    private static final int U_INDEX = recWidth * recHeight;
    private static final int V_INDEX = recWidth * recHeight * 5 / 4;
    private static final int LENGTH = recWidth * recHeight;
    private static final int LENGTH_4 = recWidth * recHeight / 4;

    private int previewFrameWidth = 1920;
    private int previewFrameHeight = 1080;

    private int[] yTextureNames;
    private int[] uTextureNames;
    private int[] vTextureNames;

    private FloatBuffer mVertices;
    private ShortBuffer mIndices;

    private int mProgramObject;
    private int mPositionLoc;
    private int mTexCoordLoc;

    private int yTexture;
    private int uTexture;
    private int vTexture;

    private final float[] mVerticesData = {-1.f, 1.f, 0.0f, // Position 0
            0.0f, 0.0f, // TexCoord 0
            -1.f, -1.f, 0.0f, // Position 1
            0.0f, 1.0f, // TexCoord 1
            1.f, -1.f, 0.0f, // Position 2
            1.0f, 1.0f, // TexCoord 2
            1.f, 1.f, 0.0f, // Position 3
            1.0f, 0.0f // TexCoord 3
    };
    private final short[] mIndicesData = {0, 1, 2, 0, 2, 3};

    private ByteBuffer yBuffer;
    private ByteBuffer uBuffer;
    private ByteBuffer vBuffer;

    private IntBuffer frameBuffer;
    private IntBuffer renderBuffer;
    private IntBuffer parameterBufferWidth;
    private IntBuffer parameterBufferHeigth;

    byte[] ydata = new byte[LENGTH];
    byte[] uData = new byte[LENGTH_4];
    byte[] vData = new byte[LENGTH_4];

    public MyRenderer() {
        mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
        mVertices.put(mVerticesData).position(0);

        mIndices = ByteBuffer.allocateDirect(mIndicesData.length * 2)
                .order(ByteOrder.nativeOrder()).asShortBuffer();
        mIndices.put(mIndicesData).position(0);

        yBuffer = ByteBuffer.allocateDirect(LENGTH);//MyGraphUtils.makeByteBuffer(LENGTH);
        uBuffer = ByteBuffer.allocateDirect(LENGTH_4);//MyGraphUtils.makeByteBuffer(LENGTH_4/* * 2*/);
        vBuffer = ByteBuffer.allocateDirect(LENGTH_4);//MyGraphUtils.makeByteBuffer(LENGTH_4);
    }



    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES20.glActiveTexture(GLES20.GL_ACTIVE_TEXTURE);
        GLES20.glViewport(0, 0, width, height);
    }

    @Override
    public void onSurfaceCreated(GL10 gl10, javax.microedition.khronos.egl.EGLConfig eglConfig) {

//    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Log.d("debug", "on surface created");
        // Define a simple shader program for our point.
//        final String vShaderStr = readTextFileFromRawResource(activity, R.raw.v_simple);
//        final String fShaderStr = readTextFileFromRawResource(activity, R.raw.f_convert);

        //Our vertex shader code; nothing special
        String vShaderStr =
                "attribute vec4 a_position;                         \n" +
                        "attribute vec2 a_texCoord;                         \n" +
                        "varying vec2 v_texCoord;                           \n" +
                        "void main(){                                       \n" +
                        "   gl_Position = a_position;                       \n" +
                        "   v_texCoord = a_texCoord;                        \n" +
                        "}                                                  \n";

        //Our fragment shader code; takes Y,U,V values for each pixel and calculates R,G,B colors,
        //Effectively making YUV to RGB conversion
        String fShaderStr =
                "#ifdef GL_ES                                       \n" +
                        "precision highp float;                             \n" +
                        "#endif                                             \n" +

                        "varying vec2 v_texCoord;                           \n" +
                        "uniform sampler2D y_texture;                       \n" +
                        "uniform sampler2D u_texture;                      \n" +
                        "uniform sampler2D v_texture;                      \n" +
//
                        "void main (void){                                  \n" +
                        "   float r, g, b, y, u, v;                         \n" +

                    //We had put the Y values of each pixel to the R,G,B components by GL_LUMINANCE,
//                    //that's why we're pulling it from the R component, we could also use G or B
                    "   y = texture2D(y_texture, v_texCoord).r;         \n" +

                    //We had put the U and V values of each pixel to the A and R,G,B components of the
                    //texture respectively using GL_LUMINANCE_ALPHA. Since U,V bytes are interspread
                    //in the texture, this is probably the fastest way to use them in the shader
                    "   u = texture2D(u_texture, v_texCoord).a - 0.5;  \n" +
                    "   v = texture2D(v_texture, v_texCoord).r - 0.5;  \n" +


                    //The numbers are just YUV to RGB conversion constants
                        "   r = y + 1.13983*v;\n" +
                        "   g = y - 0.39465*u - 0.58060*v;\n" +
                        "   b = y + 2.03211*u;\n" +

                        //We finally set the RGB color of our pixel
                        "   gl_FragColor = vec4(r, g, b, 1.0);\n" +
                        "}                                                  \n";


        frameBuffer = IntBuffer.allocate(1);
        renderBuffer = IntBuffer.allocate(1);

        GLES20.glEnable(GLES20.GL_TEXTURE_2D);

        GLES20.glGenFramebuffers(1, frameBuffer);
        GLES20.glGenRenderbuffers(1, renderBuffer);
        GLES20.glActiveTexture(GLES20.GL_ACTIVE_TEXTURE);
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBuffer.get(0));
        GLES20.glClear(0);
        GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderBuffer.get(0));

        GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16,
                1920, 1080);

        parameterBufferHeigth = IntBuffer.allocate(1);
        parameterBufferWidth = IntBuffer.allocate(1);
        GLES20.glGetRenderbufferParameteriv(GLES20.GL_RENDERBUFFER, GLES20.GL_RENDERBUFFER_WIDTH, parameterBufferWidth);
        GLES20.glGetRenderbufferParameteriv(GLES20.GL_RENDERBUFFER, GLES20.GL_RENDERBUFFER_HEIGHT, parameterBufferHeigth);
        GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_RENDERBUFFER, renderBuffer.get(0));
        if (GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER) != GLES20.GL_FRAMEBUFFER_COMPLETE) {
            Log.d("debug", "gl frame buffer status != frame buffer complete");
        }
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
        GLES20.glClear(0);

        mProgramObject = loadProgram(vShaderStr, fShaderStr);

        // Get the attribute locations
        mPositionLoc = GLES20.glGetAttribLocation(mProgramObject, "a_position");
        mTexCoordLoc = GLES20.glGetAttribLocation(mProgramObject, "a_texCoord");

        GLES20.glEnable(GLES20.GL_TEXTURE_2D);
        yTexture = GLES20.glGetUniformLocation(mProgramObject, "y_texture");
        yTextureNames = new int[1];
        GLES20.glGenTextures(1, yTextureNames, 0);
        int yTextureName = yTextureNames[0];

        GLES20.glEnable(GLES20.GL_TEXTURE_2D);
        uTexture = GLES20.glGetUniformLocation(mProgramObject, "u_texture");
        uTextureNames = new int[1];
        GLES20.glGenTextures(1, uTextureNames, 0);
        int uTextureName = uTextureNames[0];

        GLES20.glEnable(GLES20.GL_TEXTURE_2D);
        vTexture = GLES20.glGetUniformLocation(mProgramObject, "v_texture");
        vTextureNames = new int[1];
        GLES20.glGenTextures(1, vTextureNames, 0);
        int vTextureName = vTextureNames[0];

        GLES20.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    }

    @Override
    public final void onDrawFrame(GL10 gl) {
        Log.d("debug", "on Draw frame");
        // Clear the color buffer
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

        // Use the program object
        GLES20.glUseProgram(mProgramObject);
        CameraGLRenderer.checkGlError("toto");

        // Load the vertex position
        mVertices.position(0);
        GLES20.glVertexAttribPointer(mPositionLoc, 3, GLES20.GL_FLOAT, false, 5 * 4, mVertices);
        // Load the texture coordinate
        mVertices.position(3);
        GLES20.glVertexAttribPointer(mTexCoordLoc, 2, GLES20.GL_FLOAT, false, 5 * 4, mVertices);
        CameraGLRenderer.checkGlError("toto");

        GLES20.glEnableVertexAttribArray(mPositionLoc);
        GLES20.glEnableVertexAttribArray(mTexCoordLoc);
        CameraGLRenderer.checkGlError("toto");

        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yTextureNames[0]);
        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE,
                1920, 1080, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, yBuffer);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yTextureNames[0]);
        GLES20.glUniform1i(yTexture, 0);
        CameraGLRenderer.checkGlError("toto");

        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, uTextureNames[0]);
        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE,
                960, 540, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, uBuffer);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glActiveTexture(GLES20.GL_TEXTURE1 + 2);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, uTextureNames[0]);
        GLES20.glUniform1i(uTexture, 2);
        CameraGLRenderer.checkGlError("toto");

        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, vTextureNames[0]);
        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE,
                960, 540, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, vBuffer);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glActiveTexture(GLES20.GL_TEXTURE1 + 1);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, vTextureNames[0]);
        GLES20.glUniform1i(vTexture, 1);

        GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, mIndices);

        CameraGLRenderer.checkGlError("toto");
    }


    public void setPreviewFrameSize(int realWidth, int realHeight) {
        previewFrameHeight = realHeight;
        previewFrameWidth = realWidth;
    }

//    public static String readTextFileFromRawResource(final Context context, final int resourceId) {
//        final InputStream inputStream = context.getResources().openRawResource(resourceId);
//        final InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//        final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//
//        String nextLine;
//        final StringBuilder body = new StringBuilder();
//
//        try {
//            while ((nextLine = bufferedReader.readLine()) != null) {
//                body.append(nextLine);
//                body.append('\n');
//            }
//        } catch (IOException e) {
//            return null;
//        }
//
//        return body.toString();
//    }

    public static int loadShader(int type, String shaderSrc) {
        int shader;
        int[] compiled = new int[1];

        // Create the shader object
        shader = GLES20.glCreateShader(type);
        if (shader == 0) {
            return 0;
        }
        // Load the shader source
        GLES20.glShaderSource(shader, shaderSrc);
        // Compile the shader
        GLES20.glCompileShader(shader);
        // Check the compile status
        GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);

        if (compiled[0] == 0) {
            Log.e("ESShader", GLES20.glGetShaderInfoLog(shader));
            GLES20.glDeleteShader(shader);
            return 0;
        }
        return shader;
    }

    public static int loadProgram(String vertShaderSrc, String fragShaderSrc) {
        int vertexShader;
        int fragmentShader;
        int programObject;
        int[] linked = new int[1];

        // Load the vertex/fragment shaders
        vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertShaderSrc);
        if (vertexShader == 0) {
            return 0;
        }

        fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragShaderSrc);
        if (fragmentShader == 0) {
            GLES20.glDeleteShader(vertexShader);
            return 0;
        }

        // Create the program object
        programObject = GLES20.glCreateProgram();

        if (programObject == 0) {
            return 0;
        }

        GLES20.glAttachShader(programObject, vertexShader);
        GLES20.glAttachShader(programObject, fragmentShader);

        // Link the program
        GLES20.glLinkProgram(programObject);

        // Check the link status
        GLES20.glGetProgramiv(programObject, GLES20.GL_LINK_STATUS, linked, 0);

        if (linked[0] == 0) {
            Log.e("ESShader", "Error linking program:");
            Log.e("ESShader", GLES20.glGetProgramInfoLog(programObject));
            GLES20.glDeleteProgram(programObject);
            return 0;
        }

        // Free up no longer needed shader resources
        GLES20.glDeleteShader(vertexShader);
        GLES20.glDeleteShader(fragmentShader);

        return programObject;
    }

    public void onPreviewFrame(byte[] data) {

        System.arraycopy(data, 0, ydata, 0, LENGTH);
        yBuffer.put(ydata);
        yBuffer.position(0);

        System.arraycopy(data, U_INDEX, uData, 0, LENGTH_4);
        uBuffer.put(uData);
        uBuffer.position(0);

        System.arraycopy(data, V_INDEX, vData, 0, LENGTH_4);
        vBuffer.put(vData);
        vBuffer.position(0);
    }
}

Now it draws one frame and then I get a glerror on the second draw : glError 1280

bird12358
  • 117
  • 1
  • 8
  • `GLES30.glGetUniformLocation(mProgram, "u_texture")` and `GLES30.glGetUniformLocation(mProgram, "v_texture")` won't give a result (returns -1), because you have no uniforms `u_texture` and `v_texture`, but in the fragment shader there is a uniform `uniform sampler2D uv_texture`!? – Rabbid76 Aug 20 '18 at 17:07
  • Further, the texture unit of the texture object `yTextureName` is 1 - `GLES30.glActiveTexture(` **`GLES30.GL_TEXTURE1`** `);` `GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, yTextureName);`. So you have to set 1 to the texture sampler uniform `y_texture`: `GLES30.glUniform1i(yTexture, ` **`1`** `);` – Rabbid76 Aug 20 '18 at 17:13
  • It draws one and then I get a glerror on the second draw : glError 1280 – bird12358 Aug 21 '18 at 12:32
  • Error 1280 is `GL_INVALID_ENUM`. What is the different between the 1st and the 2nd draw? – Rabbid76 Aug 21 '18 at 16:31
  • The draw function is execute one time and the second time I get that error. I modified the program as mentionned un the second edit – bird12358 Aug 21 '18 at 16:35
  • There are no differents between thé first and second draw – bird12358 Aug 22 '18 at 05:35

0 Answers0