OpenGL ES 2.0遮挡纹理是可见的

在这里输入图像描述

嗨,我正在使用LibGDX和OpenGL 2.0来创建一个游戏。 到目前为止,我创建了两个网格。 前面的网格是棕色的圆形纹理,另一个网格是顶部有绿色到白色的渐变纹理。 我使用的是透视摄像机,除了一个小的人造物,其中一个应该被另一个人遮住的纹理显示出来(见图),一切看上去都不错。

我相当新的OpenGL和LibGDX。 我在背面启用了剔除function,并且可以用GL_DEPTH_TEST解决问题。 如果我将glDepthFunc设置为GREATER或LESS,则不显示任何内容。 目前我正在使用LEQUAL。 所以我不确定我是否在正确的轨道上,或者如果问题在其他地方引起的话。 任何帮助,将不胜感激。

我正在使用一些非常简单的着色器:

String vertexShader = "attribute vec4 a_position; \n" + "attribute vec4 a_color;\n" + "attribute vec2 a_texCoord0;\n" + "uniform mat4 u_worldView;\n" + "varying vec4 v_color;" + "varying vec2 v_texCoords;" + "void main() \n" + "{ \n" + " v_color = vec4(1, 1, 1, 1); \n" + " v_texCoords = a_texCoord0; \n" + " gl_Position = u_worldView * a_position; \n" + "} \n" ; String fragmentShader = "#ifdef GL_ES\n" + "precision mediump float;\n" + "#endif\n" + "varying vec4 v_color;\n" + "varying vec2 v_texCoords;\n" + "uniform sampler2D u_texture;\n" + "void main() \n" + "{ \n" + " gl_FragColor = v_color * texture2D(u_texture, v_texCoords);\n"+ "}"; 

剔除和深度已被设置为:

 Gdx.gl.glEnable(GL20.GL_CULL_FACE); Gdx.gl.glCullFace(GL20.GL_BACK); Gdx.gl.glEnable(GL20.GL_DEPTH_TEST); Gdx.gl.glDepthFunc(GL20.GL_LEQUAL); 

渲染代码:

 grassTexture.bind(); //the top mesh texture shader2.begin(); shader2.setUniformMatrix("u_worldView", cameraSystem.camera.combined); shader2.setUniformi("u_texture", 1); topMesh.render(shader2, GL20.GL_TRIANGLES); shader2.end(); texture.bind(); //the brown circle texture shader2.begin(); shader2.setUniformMatrix("u_worldView", cameraSystem.camera.combined); shader2.setUniformi("u_texture", 0); mesh.render(shader2, GL20.GL_TRIANGLES); shader2.end(); 

清算:

 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT| GL20.GL_DEPTH_BUFFER_BIT); 

更新信息:

这个想法是,我正在试图创建一个2.5D的地形。 棕色区域是地形和2D部分的横截面。 绿色的地形是“屋顶”,它有z-深度设置给它2.5D的透视看。 问题是圆中的部分不应该是可见的。 人们可以看到,绿色的屋顶有一个小山丘,然后地形下降。 倾斜地形的顶部不被顶部屋顶部分阻挡。 这是唯一发生的事情。 我已经遮蔽了应该隐藏在粉红色的部分。

在这里输入图像描述

至于我的Z-顺序,我已经设置了索引以逆时针顺序创建三角形。 我认为这一部分是正确的,好像我从后面改变剔除我得到预期的结果。 我创建顶部网格的方法是通过Box2D chainhape(物理使用)向后迭代,并将z设置为-10,然后再次循环,但是这次从一开始就添加z设置为0的位置。创建一个圆形网格。 从上到下,这将创建一个矩形,然后将其细分为四边形,然后分解成三角形。 这是它的代码:

  ChainShape shape = ((ChainShape)fix.getShape()); vertices= new float[(shape.getVertexCount()*2*9)]; float b = 1f; indicies = new short[(shape.getVertexCount()-1)*2*3]; int c = 0; for(int i=shape.getVertexCount()-1;i>=0;i--) { //back part of mesh starting from right to left Vector2 va = new Vector2(); shape.getVertex(i, va); vertices[c] = va.x*b+pos.x; c++; vertices[c] = va.y*b+pos.y; c++; vertices[c] = -10.0f; c++; //colour vertices[c] =1; c++; vertices[c]= 1; c++; vertices[c] =1f; c++; vertices[c] =1f; c++; //uv vertices[c] =(va.x*b+pos.x)/20f; c++; vertices[c] =0; c++; } for(int i=0;i<shape.getVertexCount();i++) { //front part of mesh starting from left to right Vector2 va = new Vector2(); shape.getVertex(i, va); vertices[c] = va.x*b+pos.x; c++; vertices[c] = va.y*b+pos.y; c++; vertices[c] = 0.0f; c++; vertices[c] =1f; c++; vertices[c] =1f; c++; vertices[c] =1f; c++; vertices[c] =1f; c++; vertices[c] =(va.x*b+pos.x)/20f; c++; vertices[c] =1; c++; } short val = (short)(0); for(int i=0;i<indicies.length;) { indicies[i]=(short) (val); i++; indicies[i]=(short) ((shape.getVertexCount()*2-1)-val); i++; indicies[i]=(short) (val+1); i++; indicies[i]=(short) ((shape.getVertexCount()*2-1)-val); i++; indicies[i]=(short) ((shape.getVertexCount()*2-1)-(val+1)); i++; indicies[i]=(short) (val+1); i++; val++; } 

您正在设置正确的深度testing。 请注意,这种情况下不需要背面剔除,但由于其他原因仍然可以使用。

调用gluPerspective时,您的深度testing不能正常工作的可能原因可能是0.0作为近平面。 有关更多信息,请参阅https://stackoverflow.com/questions/4764057/opengl-depth-test-not-working-as-expected 。 通过在z轴附近使用正值进行修正后,默认的深度函数GL_LESS也应该可以工作。