读取圆圈更靠近观察者,纹理具有透明背景。
(两个对象都是具有相同大小的正方形,只有不同的纹理和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。
答案 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)
写入深度缓冲区。
否则蓝色四边形会被红色四边形剔除。