Android OpenGL ES 2.0多重纹理和相机

我正在尝试使用GLSurfaceView.Renderer和SurfaceTexture.OnFrameAvailableListener将两个纹理混合在一起。

第一个纹理是一个实时相机预览SurfaceTexture,它可以很好地工作(质量很差,但这是另一回事:)

第二个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 : requiren" +     
        "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。

任何提示,链接,甚至代码片段将不胜感激!

先谢谢你


你如何加载来自位图数据的外部纹理? 我建议使用2D纹理代替覆盖。 然后,为了将图像加载到纹理,您可以使用:

Bitmap bitmap1 = null;
InputStream stream = null;
try {
   stream = new FileInputStream("/mnt/sdcard/...jpg");
} catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
bitmap1 = BitmapFactory.decodeStream(stream);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap1, 0);
bitmap1.recycle();

并且为了混合片段着色器中的纹理数据:

"gl_FragColor = mix(base, blend, blend.a);  n";

其中base是来自相机纹理的数据,blend是来自位图纹理的数据。

链接地址: http://www.djcxy.com/p/33605.html

上一篇: Android OpenGL ES 2.0 multiple textures and Camera

下一篇: glUniform4fv is giving GL