3

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

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

我想:

在此处输入图像描述

但是我有:

在此处输入图像描述

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

当前加载纹理的代码:

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。

4

3 回答 3

1

你不想混合,因为那会混合颜色。你想要的是alphatesting。使用glEnable(GL_ALPHA_TEST)glAlphaFunc适当地设置它。

于 2013-03-04T15:19:02.307 回答
0

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

尝试 :

 gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_DST_ALPHA);
于 2013-03-03T19:59:58.807 回答
0

您应该禁用写入深度缓冲区:

glDepthMask(false);

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

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

于 2013-03-04T15:09:00.260 回答