2012-07-31 1 views
3

알파 채널이있는 여러 육각형을 그려야합니다.OpenGLES 2.0 PNG 알파 텍스처 오버랩

http://img834.imageshack.us/img834/571/hexagon.png

그래서, 나는이 프로그램에 텍스처를로드하고 괜찮아요 : 이미지가 이것이다. 알파 채널이 실행되면 배경색과 혼합되어 괜찮습니다. 그러나 두 개의 육각형이 겹치면 겹쳐진 부분이 배경색이됩니다! 사진 아래 : 물론

http://img259.imageshack.us/img259/213/20120731163847.png

, 이것은 내가 그들이 배경이 다른 질감을 통해 그려 않고 중복 싶어 .. 내가 기대 효과가 없습니다.

GLES20.glUseProgram(Program); 

    hVertex = GLES20.glGetAttribLocation(Program,"vPosition"); 
    hColor = GLES20.glGetUniformLocation(Program, "vColor"); 
    uTexture = GLES20.glGetUniformLocation(Program, "u_Texture"); 
    hTexture = GLES20.glGetAttribLocation(Program, "a_TexCoordinate"); 
    hMatrix = GLES20.glGetUniformLocation(Program, "uMVPMatrix"); 

    GLES20.glVertexAttribPointer(hVertex, 3, GLES20.GL_FLOAT, false, 0, bVertex); 
    GLES20.glEnableVertexAttribArray(hVertex); 
    GLES20.glUniform4fv(hColor, 1, Color, 0); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, hTexture); 
    GLES20.glUniform1i(uTexture, 0); 
    GLES20.glVertexAttribPointer(hTexture, 2, GLES20.GL_FLOAT, false, 0, bTexture); 
    GLES20.glEnableVertexAttribArray(hTexture); 

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

    x=-1;y=0;z=0; 
    for (int i=0;i<10;i++) { 
     Matrix.setIdentityM(ModelMatrix, 0); 
     Matrix.translateM(ModelMatrix, 0, x, y, z); 
     x+=0.6f; 
     Matrix.multiplyMM(ModelMatrix, 0, ModelMatrix, 0, ProjectionMatrix, 0); 
     GLES20.glUniformMatrix4fv(hMatrix, 1, false, ModelMatrix, 0); 
     GLES20.glDrawElements(GLES20.GL_TRIANGLES, DrawOrder.length, GLES20.GL_UNSIGNED_SHORT, bDrawOrder); 
    } 

    GLES20.glDisable(GLES20.GL_BLEND); 
    GLES20.glDisableVertexAttribArray(hVertex); 
} 

그리고 내 조각 쉐이더 :

public final String fragmentShaderCode = 
     "precision mediump float;" + 
     "uniform vec4 vColor;" + 
     "uniform sampler2D u_Texture;" + 
     "varying vec2 v_TexCoordinate;" + 
     "void main() {" + 
     " gl_FragColor = vColor * texture2D(u_Texture, v_TexCoordinate);" + 
     "}"; 

내 렌더러 코드 :

super(context); 
    setEGLContextClientVersion(2); 
    getHolder().setFormat(PixelFormat.TRANSLUCENT); 
    setEGLConfigChooser(8, 8, 8, 8, 8, 8); 
    renderer = new GLRenderer(context); 
    setRenderer(renderer); 

가 이미 glBlendFunc에 가지 다른 기능을 사용하려고하지만 아무것도 보인다 여기 도면 내 코드입니다 누구든지 문제가 무엇인지 압니까? 나는 정말로 잃어 버렸다. 필요가 더 이상 필요하다면 단지 물어 보라!

감사합니다.

+0

언제든지 깊이 테스트를 사용하도록 설정 했습니까? – Tim

+0

예, 할 수 있습니다. onSurfaceCreated 함수에서 활성화하고 있습니다. 이 마이그레이션이 블렌딩에 있었지만 블렌딩 유형을 변경하는 효과가 없다고 생각합니다. 텍스처는 여전히이 이상한 알파에서 겹칩니다. – rdnobrega

답변

6

내 생각 엔 이것을 그리기 위해 깊이 테스트를 비활성화해야합니다. 그것들은 모두 같은 깊이에 나타나기 때문에 가장 왼쪽의 링을 그릴 때 쿼드의 모든 픽셀에 대해 깊이 버퍼에 씁니다. 투명 픽셀까지도 씁니다.

다음 쿼드를 오른쪽으로 그릴 때 겹치는 픽셀은 깊이 테스트에 실패하여 그려지지 않으므로 첫 번째 쿼드와 교차하는 빈 영역을 얻게됩니다.

+0

완벽하게 작동했습니다! 나는 결코 그것을 추측하지 않을 것이다. 고맙다! =) – rdnobrega