我有一个奇怪的问题,我无法理解为我的生活。我正在从Maya加载OBJ模型文件并将其渲染为OpenGL环境。这似乎很顺利,在我的独立模型查看器中,它们显示正确。但是,当加载到游戏环境中时(有一些我无法控制的奇怪的投影矩阵),模型无法正确显示。
顶点SEEM位于旋转模型的正确位置,可以给出正确的3D感。但是,根据深度功能,模型的不同部分会出现(不正确)。
例如,在人的模型中,当人从左向右行走时(例如,模型的右侧对于相机是可见的);如果深度功能设置为GL_LEQUAL
,则当人在躯干前方时,您无法看到该人的右臂。但是,当模式设置为GL_LESS
时,您可以看到左臂穿过躯干。这是用图片更容易看到的东西之一,所以我们走了:
GL_LESS
或GL_NOTEQUAL
:
GL_LEQUAL
或GL_ALWAYS
:
应该注意的是,任何其他深度功能都不会显示任何内容。在GL_LEQUAL系列的第一张照片中,您可以看到左臂在不应该被躯干遮挡的情况下被部分遮挡。
以下是用于呈现模型的代码:
gl.glDisable(GL.GL_BLEND);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
layerTextureShader.updateShader(gl, projection, disparityTop, disparityBottom, fieldMask, 1);
// gl.glDepthFunc(GL.GL_NEVER); // 512
// gl.glDepthFunc(GL.GL_LESS); // 513
// gl.glDepthFunc(GL.GL_EQUAL); // 514
// gl.glDepthFunc(GL.GL_LEQUAL); // 515
// gl.glDepthFunc(GL.GL_GREATER); // 516
// gl.glDepthFunc(GL.GL_NOTEQUAL); // 517
// gl.glDepthFunc(GL.GL_GEQUAL); // 518
// gl.glDepthFunc(GL.GL_ALWAYS); // 519
gl.glDepthFunc(currentGlComparison);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
gl.glDepthMask(true);
gl.glDepthRange(0, 0.01);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getVertexBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 3 * 4, getVertices(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 2 * 4, getTexCoords(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, getIndicesBufferObject());
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, getNoOfIndices() * 4, getIndices(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getColorBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 4 * 4, getColors(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glActiveTexture(GL.GL_TEXTURE0);
layerTextureShader.use(gl);
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getVertexBufferObject());
gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
gl.glEnableClientState(GL.GL_COLOR_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, mask ? getMaskColorBufferObject() : getColorBufferObject());
gl.glColorPointer(4, GL.GL_FLOAT, 0, 0);
gl.glClientActiveTexture(GL.GL_TEXTURE0);
gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject());
gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, getIndicesBufferObject());
final int count = getNoOfIndices();
gl.glDrawElements(GL.GL_TRIANGLES, count, GL.GL_UNSIGNED_INT, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL.GL_COLOR_ARRAY);
gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY);
layerTextureShader.release(gl);
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glDisable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_BLEND);
gl.glPopMatrix();
感谢任何人提供任何帮助,这让我难以忍受了好几天。
答案 0 :(得分:2)
看起来投影矩阵设置如下:
gluPerspective ( 90, (GLint)width/ (GLint)height, 0.0, 200.0 );
看到错误? - 0.0值是不可接受的。只有正值才是好的 使用0.01而不是0.0作为第三个参数。