结合表面纹理(外部基本相机进纸)和普通纹理

时间:2016-03-21 12:28:20

标签: android android-camera opengl-es-2.0 fragment-shader

我正在尝试将表面纹理(外部基本上是相机进纸)和普通纹理结合起来,当我运行此屏幕变为黑色我在galaxy s5中尝试过,s6得到了相同的结果,在线搜索但找不到任何资源这个,欢迎任何反馈。

着色

private final String vertexShaderCodeCamera ="uniform mat4 uMVPMatrix;" +
        "attribute vec4 position;" +
                "attribute vec2 inputTextureCoordinate;" +
                "varying vec2 textureCoordinate;" +
                "attribute vec3 a_normal;"+ //new line
                "varying vec3 v_normal;"+//new line
                "uniform mat4 u_MVMatrix;" +
                "void main()" +
                "{" +
                " gl_Position = uMVPMatrix * position;" +
                "textureCoordinate = inputTextureCoordinate;" +
                "v_normal = vec3(u_MVMatrix * vec4(a_normal, 0.0));"+

                "}";

private final String fragmentShaderCodeCamera =
                "#extension GL_OES_EGL_image_external : require\n" +
                "precision mediump float;" +
                "varying vec2 textureCoordinate;                            \n" +
                "uniform samplerExternalOES s_texture;               \n" +
                "uniform sampler2D Texture;" +
                "void main(void) {" +
                "gl_FragColor = texture2D(s_texture, textureCoordinate );\n" +
                "gl_FragColor = texture2D(Texture, textureCoordinate);" +
                 "}";

相机绘制方法:

public void display_Camera(int texture){
    GLES20.glUseProgram(cam_mProgram);

    GLES20.glActiveTexture(GL_TEXTURE_EXTERNAL_OES);
    GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture);


    cam_mPositionHandle = GLES20.glGetAttribLocation(cam_mProgram, "position");
    GLES20.glEnableVertexAttribArray(cam_mPositionHandle);
    GLES20.glVertexAttribPointer(cam_mPositionHandle, CAM_COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStrideSquare, vertexBuffer);


    cam_mTextureCoordHandle = GLES20.glGetAttribLocation(cam_mProgram, "inputTextureCoordinate");
    GLES20.glEnableVertexAttribArray(cam_mTextureCoordHandle);
    GLES20.glVertexAttribPointer(cam_mTextureCoordHandle, CAM_COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStrideSquare, textureVerticesBuffer);

    cam_mColorHandle = 2;//GLES20.glGetAttribLocation(cam_mProgram, "s_texture");


    GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer);


    // Disable vertex array
    GLES20.glDisableVertexAttribArray(cam_mPositionHandle);
    GLES20.glDisableVertexAttribArray(cam_mTextureCoordHandle);

}

模型绘制方法:

public void draw1(float[] mvpMatrix) {
    // Add program to OpenGL environment
    GLES20.glUseProgram(cam_mProgram);

    // get handle to shape's transformation matrix
    mPositionHandle = 0;//GLES20.glGetAttribLocation(cam_mProgram, "vPosition");
    // get handle to vertex shader's vPosition member
    mMVPMatrixHandle = GLES20.glGetUniformLocation(cam_mProgram, "uMVPMatrix");
    MainActivity.checkGLError("glGetUniformLocation");


    fsTexture = GLES20.glGetUniformLocation(cam_mProgram, "Texture");
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
    GLES20.glUniform1i(fsTexture, 0);
    vsTextureCoord = 1;//GLES20.glGetAttribLocation(cam_mProgram, "texCoord");

    mNormalHandle = 3;//GLES20.glGetAttribLocation(cam_mProgram, "a_normal");//new line

    // Enable a handle to the triangle vertices
    GLES20.glEnableVertexAttribArray(mPositionHandle);

    // Prepare the triangle coordinate data
    GLES20.glVertexAttribPointer(
            mPositionHandle, COORDS_PER_VERTEX,
            GLES20.GL_FLOAT, false,
            vertexStride, vertexBuffer);
    GLES20.glVertexAttribPointer(vsTextureCoord, COORDS_PER_TEXTURE,
            GLES20.GL_FLOAT, false,
            TextureStride, texBuffer);
    GLES20.glEnableVertexAttribArray(vsTextureCoord);

    GLES20.glVertexAttribPointer(mNormalHandle, COORDS_PER_NORMAL, GLES20.GL_FLOAT, false,
            12, normalbuffer);//new line

    GLES20.glEnableVertexAttribArray(mNormalHandle);//new line
    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
    MainActivity.checkGLError("glUniformMatrix4fv");

    // Draw the triangle
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, tablelamp21NumVerts);

    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);
    GLES20.glDisableVertexAttribArray(vsTextureCoord);
    GLES20.glDisableVertexAttribArray(mNormalHandle);
}

着色器链接:

cam_mProgram = GLES20.glCreateProgram();             // create empty OpenGL Program
    if (cam_mProgram != 0)
    {
        // Bind the vertex shader to the program.
        GLES20.glAttachShader(cam_mProgram, cameravertexShader);

        // Bind the fragment shader to the program.
        GLES20.glAttachShader(cam_mProgram, camerafragmentShader);

        // Bind attributes
        GLES20.glBindAttribLocation(cam_mProgram, 0, "position");
        GLES20.glBindAttribLocation(cam_mProgram, 1, "inputTextureCoordinate");
        GLES20.glBindAttribLocation(cam_mProgram, 2, "s_texture");//new line
        GLES20.glBindAttribLocation(cam_mProgram, 3, "a_normal");//new line

        // Link the two shaders together into a program.
        GLES20.glLinkProgram(cam_mProgram);

        // Get the link status.
        final int[] linkStatus = new int[1];
        GLES20.glGetProgramiv(cam_mProgram, GLES20.GL_LINK_STATUS, linkStatus, 0);

        // If the link failed, delete the program.
        if (linkStatus[0] == 0)
        {
            GLES20.glDeleteProgram(cam_mProgram);
            cam_mProgram = 0;
        }
    }

0 个答案:

没有答案