1

我将我的场景渲染为下面的代码

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;
}

我的项目使用乌龙引擎

这是两张截图,iPodTouch 4G (iOS 6.0)

iPodTouch 4G (iOS 6.0)

和 iPodTouch 2G (iOS 4.2.1)

和 iPodTouch 2G (iOS 4.2.1)

是什么原因导致出现在后面的屏幕截图中的那些奇怪的工件?

看起来好像背面的三角形与前面的三角形重叠

有时会发生这种情况,因为工件是生涩的,就像存在“z-fighting”一样,但背面的三角形的 z 值低于前面三角形的 z 值

这是顶点和法线z排列的图像

在此处输入图像描述

蓝色箭头是周围面共享的法线,带有红线的三角形表示可能导致这些伪影的原因

4

1 回答 1

0

就像存在“z-fighting”一样,但背面三角形的 z 值低于前面三角形的 z 值

一个的 z 值小于另一个并不重要,当你的对象靠得太近并且你没有足够的 z 分辨率时,你会发生 z 冲突。

我猜这里的问题是您将投影范围设置得太大,从 0.1 到 1000。这些数字之间的差异越大,您获得的 z 分辨率就越低。

只要适用于您的应用程序,我建议尝试使用 0.1/100 或 1.0/1000 的近/远。它应该可以帮助您解决 z-fighting 问题。

于 2012-10-15T04:40:50.773 回答