2013-04-11 65 views
1

我我OnDrawFrame函數內不少致命信號(GLSurfaceView.Renderer,SurfaceTexture.OnFrameAvailableListener)

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 

來電之後得到一個致命的信號11。這些紋理在崩潰前正確繪製,我相信這意味着我的頂點和片段着色器可以正常工作。

我想要做的是使用GLSurfaceView.Renderer和SurfaceTexture.OnFrameAvailableListener將兩個紋理混合在一起。

第一個紋理是一個實時相機預覽SurfaceTexture,它可以自行工作。第二個tetxure只是一個位圖圖像,它也可以很好地工作。但是將它們結合起來會導致崩潰

我OnDrawFrame如下:

public void onDrawFrame(GL10 glUnused) { 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

    synchronized(this) { 
     if (updateSurface) { 
      mSurface.updateTexImage(); 
      mSurface.getTransformMatrix(mSTMatrix); 
      updateSurface = false; 
     } 
    } 

    maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition"); 
    maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord"); 
    muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); 
    muSTMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uSTMatrix"); 
    muCRatioHandle = GLES20.glGetUniformLocation(mProgram, "uCRatio"); 

    GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textures[0]); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    int t1h = GLES20.glGetUniformLocation (mProgram, "sTexture1"); 
    //  GLES20.glUniform1i(t1h, textures[0]); 
    GLES20.glUniform1i(t1h, 1); 

    GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textures[1]); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
    int t2h = GLES20.glGetUniformLocation (mProgram, "sTexture2"); 
    GLES20.glUniform1i(t2h, 2); 

    GLES20.glUseProgram(mProgram); 

    GLES20.glEnable(GLES20.GL_BLEND); 
    GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

    mTriangleVertices.position(0); 
    GLES20.glEnableVertexAttribArray(maPositionHandle); 
    GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 
      4*5, mTriangleVertices); 

    mTriangleVertices.position(3); 
    GLES20.glEnableVertexAttribArray(maTextureHandle); 
    GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false, 
      4*5, mTriangleVertices); 

    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.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0); 

    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
    GLES20.glDisableVertexAttribArray(maPositionHandle); 
    GLES20.glDisableVertexAttribArray(maTextureHandle); 
    //  GLES20.glFlush(); 
} 

其中mTriangleVertices是:

mTriangleVertices = ByteBuffer.allocateDirect(mTriangleVerticesData.length 
      * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
mTriangleVertices.put(mTriangleVerticesData).position(0); 

和mTriangleVerticesData是:

private final float[] mTriangleVerticesData = { 
    // X, Y, Z, U, V 
    -1.0f, -1.0f, 0, 0.f, 0.f, 
    1.0f, -1.0f, 0, 1.f, 0.f, 
    -1.0f, 1.0f, 0, 0.f, 1.f, 
    1.0f, 1.0f, 0, 1.f, 1.f, 
}; 

任何提示,鏈接,甚至代碼段會更不勝感激!

預先感謝您

回答

2

不知道這是墜機原因,但你至少分配着色器一個過高的質感IDS。例如;

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
int t1h = GLES20.glGetUniformLocation (mProgram, "sTexture1"); 
GLES20.glUniform1i(t1h, 1); 

應改爲

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
int t1h = GLES20.glGetUniformLocation (mProgram, "sTexture1"); 
GLES20.glUniform1i(t1h, 0); 

編輯:嗯,這可能是墜機原因:

GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false, 
     4*5, mTriangleVertices); 

應該

GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 
     4*5, mTriangleVertices); 

,因爲你更容易每個頂點有兩個紋理值。

+0

Harism謝謝你答覆我的兩個帖子:)如果我有足夠的聲望,我也會給你一個upvote :)這工作完美! – user2267143 2013-04-12 08:57:55