2011-01-25 46 views
2

我遇到了一個奇怪的問題,我無法弄清楚我的生活。我從Maya加載OBJ模型文件並將其渲染爲OpenGL環境。這看起來很順利,在我的獨立模型瀏覽器中,它們顯示正確。然而,當加載到遊戲環境中時(我有一個奇怪的投影矩陣,我無法控制),模型顯示不正確。OpenGL繪圖模型中的奇怪深度/融合

頂點SEEM在旋轉模型的正確位置給出正確的3D感。但是,根據深度函數,模型的不同部分顯示(不正確)。例如,在人的模型中,當人從左向右步行時(例如,模型的右側對於照相機可見)時;如果將深度功能設置爲GL_LEQUAL,則在軀幹前方無法看到人的右臂。但是,當模式設置爲GL_LESS時,您可以通過軀幹看到左臂。這是那些東西,更容易看到照片所以在這裏我們去一個:

GL_LESSGL_NOTEQUAL

enter image description here enter image description here

GL_LEQUALGL_ALWAYS

enter image description here enter image description here enter image description here

應該指出,任何其他深度功能都不會顯示任何內容。在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

通常您會使用LESS,但是從圖像看,投影矩陣看起來像是「展平」模型,因此所有頂點都處於相同的深度。需要更多關於如何設置投影的信息才能真正回答這個問題 – 2011-01-25 13:20:00

+0

感謝您的洞察力,所以您會建議我執行一些計算(例如GL_Projection * GL_ModelView * GameProjectionMatrix * PointXYZ)以查看實際正在打印的內容? – 2011-01-25 13:51:34

回答

2

看起來像投影矩陣設置是這樣的:

gluPerspective (90, (GLint)width/ (GLint)height, 0.0, 200.0); 

看到錯誤? - 0.0值是不可接受的。只有正值是好的 使用類似0.01而不是0.0作爲第三個參數。