我想使用GLSurfaceView.Renderer和SurfaceTexture.OnFrameAvailableListener将两个纹理混合在一起。Android OpenGL ES 2.0多纹理和相机
的第一个纹理是一个活生生的摄像头预览表面纹理,其通过自身的(质量不好工作得很好,但那是另一回事:)
第二tetxure只是一个位图图像,这也是由它自己的正常工作。
对于这两种纹理我使用:
GLES20.glActiveTexture(GLES20.GL_TEXTUREX); //GL_TEXTURE0 and GL_TEXTURE1 respectively
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureX);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
内onSurfaceCreated
。
在我OnDrawFrame我:
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
GLES20.glEnableVertexAttribArray(maPositionHandle);
checkGlError("glEnableVertexAttribArray maPositionHandle");
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
checkGlError("glVertexAttribPointer maPosition");
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
GLES20.glEnableVertexAttribArray(maTextureHandle);
checkGlError("glEnableVertexAttribArray maTextureHandle");
GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
checkGlError("glVertexAttribPointer maTextureHandle");
Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);
GLES20.glUniform1f(muCRatioHandle, mCameraRatio);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
checkGlError("glDrawArrays");
我的着色器:
private final String mVertexShader =
"uniform mat4 uMVPMatrix;\n" +
"uniform mat4 uSTMatrix;\n" +
"uniform float uCRatio;\n" +
"attribute vec4 aPosition;\n" +
"attribute vec4 aTextureCoord;\n" +
"varying vec2 vTextureCoord;\n" +
"varying vec2 vTextureNormCoord;\n" +
"void main() {\n" +
" gl_Position = uMVPMatrix * aPosition;\n" +
" vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
" vTextureNormCoord = aTextureCoord.xy;\n" +
"}\n";
和
private final String mFragmentShader =
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"varying vec2 vTextureNormCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"uniform samplerExternalOES sTexture1;\n" +
"void main() {\n" +
" vec4 temp_FragColor1 = texture2D(sTexture, vTextureCoord);\n" +
" vec4 temp_FragColor2= texture2D(sTexture1, vTextureCoord);\n" +
"gl_FragColor = temp_FragColor1;\n" +
"}\n";
的什么,我试图做的想法,是在该片段中着色器,要有
gl_FragColor = temp_FragColor1 + temp_FragColor2;
与相机顶部的位图纹理实时预览(位图纹理与相机纹理混合)。因此,如果位图纹理片段的alpha小于1,则应显示相机纹理的片段。 当我尝试这个,我得到一个致命的信号11.
任何提示,链接,甚至代码片段将不胜感激!
提前谢谢
检查''mix''着色器命令。如果我正确理解你的目标,那么使用alpha作为混合因子应该能够做到这一点 – harism 2013-04-10 17:46:37