OpenGL混合模式和深度缓冲

时间:2013-03-03 19:54:18

标签: android opengl-es

读取圆圈更靠近观察者,纹理具有透明背景。

(两个对象都是具有相同大小的正方形,只有不同的纹理和x,z坐标)。

我想:

enter image description here

但我有:

enter image description here

我知道我必须对混合模式和深度缓冲区做一些事情,但我不确切知道是什么。有人能帮助我吗?

加载纹理的当前代码:

public void initTexture(GL10 gl, Bitmap bitmap) {
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    int[] texture = new int[1];
    gl.glGenTextures(1, texture, 0);

    textureId = texture[0];
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

    GLUtils.texImage2D(GLES10.GL_TEXTURE_2D, 0, bitmap, 0);
    bitmap.recycle();
}

绘图的相关部分,对于每个对象:

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glFrontFace(GL10.GL_CW);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    gl.glDrawElements(GLES20.GL_TRIANGLES, indices.length,  GLES10.GL_UNSIGNED_SHORT, indicesBuffer);

谢谢!

注意:我正在使用OpenGL ES 1。

3 个答案:

答案 0 :(得分:1)

你不想混合,因为那会混合颜色。你想要的是 alphatesting 。使用glEnable(GL_ALPHA_TEST)glAlphaFunc进行相应设置。

答案 1 :(得分:0)

我认为你必须改变你的混合功能:

尝试:

 gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_DST_ALPHA);

答案 2 :(得分:0)

你应该禁止写入深度缓冲区:

glDepthMask(false);

然后先绘制蓝色四边形,然后绘制红色四边形(靠近相机)。绘制透明几何图形后,您可能希望再次使用glDepthMask(true)写入深度缓冲区。

否则蓝色四边形会被红色四边形剔除。