2012-10-14 14 views
1

我渲染我的場景如下OpenGL的文物 - 三角形上舊的iOS設備

struct vertex 
{ 
    float x, y, z, nx, ny, nz; 
}; 

bool CShell::UpdateScene() 
{ 
    glEnable(GL_DEPTH_TEST); 
    glClearColor(0.3f, 0.3f, 0.4f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Set the OpenGL projection matrix 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    const float near = 0.1f; 
    const float far = 1000.0f; 

    float top = near * tanf(fieldOfView * SIMD_PI/180.0f); 
    float bottom = -top; 
    float left = bottom * aspectRatio; 
    float right = top * aspectRatio; 

    glFrustumf(left, right, bottom, top, near, far); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 


bool CShell::RenderScene() 
{ 
    glEnable(GL_DEPTH_TEST); 

    glBindBuffer(GL_ARRAY_BUFFER, vertsVBO); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 

    glVertexPointer(3, GL_FLOAT, elementSize, 0); 
    glNormalPointer(GL_FLOAT, elementSize, (const GLvoid*) normalOffset); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesVBO); 

    glEnable(GL_LIGHTING); 

    lightPosition[0] = (-gravity.x()+0.0)*lightHeight; 
    lightPosition[1] = (-gravity.y()+0.0)*lightHeight; 
    lightPosition[2] = (-gravity.z()+0.5)*lightHeight; 

    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); 

    float worldMat[16]; 

    /// draw donuts 
    for (int i=0;i<numDonuts;i++) 
    { 
     sBoxBodies[i]->getCenterOfMassTransform().getOpenGLMatrix(worldMat); 

     glPushMatrix(); 
     glMultMatrixf(worldMat); 

     glVertexPointer(3, GL_FLOAT, elementSize, (const GLvoid*)(char*)sizeof(vertex)); 
     glNormalPointer(GL_FLOAT, elementSize, (const GLvoid*)(char*)(sizeof(vertex)+normalOffset)); 

     glDrawElements(GL_TRIANGLES, numberOfIndices, GL_UNSIGNED_SHORT, (const GLvoid*)(char*)sizeof(GLushort)); 

     glPopMatrix(); 
    } 

    glBindBuffer(GL_ARRAY_BUFFER,0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

    glDisable(GL_LIGHTING); 

    return true; 
} 

我的項目的代碼後面重疊的那些正面採用烏龍引擎

這是兩個截屏, iPod Touch的4G(iOS的6.0)

iPodTouch 4G (iOS 6.0)

和iPod Touch的2G(的iOS 4.2.1)

and iPodTouch 2G (iOS 4.2.1)

什麼可能導致出現在以後的屏幕截圖的那些奇怪的artitact?

它apears彷彿背面的三角形重疊的那些前

它發生有時想,作爲artifats是生澀的,這就像如果有「Z-戰鬥」,但在三角形背部具有低於那些的z值於在前

這裏是三角形的頂點和法線ž佈置的圖像

enter image description here

藍色箭頭是由SURR共享法線ounding的面孔,用紅色線三角形是什麼可能會導致這些文物

回答

0

這就像如果有「Z-戰鬥」,但在後面的三角形上必須低於Z值的三角形表示正面

z值小於另一個並不重要,當物體太靠近並且沒有足夠的z分辨率時,會發生z戰鬥。

這裏的問題我猜是你設置的投影範圍太大,從0.1到1000.這些數字之間的差異越大,你得到的z分辨率就越少。

我建議嘗試接近/遠遠的0.1/100或1.0/1000,只要它適用於您的應用程序。它應該可以幫助你解決問題。

+0

感謝您回答我的問題,您完全正確,修改了靠近我的模型的近平面和遠平面,工件就消失了 – rraallvv