我遇到了一個奇怪的問題,我無法弄清楚我的生活。我從Maya加載OBJ模型文件並將其渲染爲OpenGL環境。這看起來很順利,在我的獨立模型瀏覽器中,它們顯示正確。然而,當加載到遊戲環境中時(我有一個奇怪的投影矩陣,我無法控制),模型顯示不正確。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();
由於任何人的任何幫助,這讓我難倒了不少天了。
通常您會使用LESS,但是從圖像看,投影矩陣看起來像是「展平」模型,因此所有頂點都處於相同的深度。需要更多關於如何設置投影的信息才能真正回答這個問題 – 2011-01-25 13:20:00
感謝您的洞察力,所以您會建議我執行一些計算(例如GL_Projection * GL_ModelView * GameProjectionMatrix * PointXYZ)以查看實際正在打印的內容? – 2011-01-25 13:51:34