1

GLSurfaceView.Renderer と SurfaceTexture.OnFrameAvailableListener を使用して、2 つのテクスチャをブレンドしようとしています。

最初のテクスチャは、ライブ カメラ プレビューの SurfaceTexture で、単独で正常に動作します (品質は悪いですが、それは別問題です :)

2 番目のテクスチャは単なるビットマップ イメージで、これだけでも問題なく動作します。

私が使用している両方のテクスチャについて:

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;

カメラ ライブ プレビューの上にビットマップ テクスチャを配置します (ビットマップ テクスチャとカメラ テクスチャのブレンド)。したがって、ビットマップ テクスチャ フラグメントのアルファが 1 未満の場合、カメラ テクスチャのフラグメントが表示されます。これを試すと、Fatal Signal 11 が表示されます。

ヒント、リンク、さらにはコードの断片をいただければ幸いです。

前もって感謝します

4

1 に答える 1

2

ビットマップからのデータを使用して外部テクスチャをどのようにロードしていますか? オーバーレイの代わりに 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 はビットマップ テクスチャからのデータです。

于 2013-06-04T13:23:28.793 に答える