Frage

I am rendering my scene as the code below

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

My project uses Oolong Engine

These are two screenshots, iPodTouch 4G (iOS 6.0)

iPodTouch 4G (iOS 6.0)

and iPodTouch 2G (iOS 4.2.1)

and iPodTouch 2G (iOS 4.2.1)

What could be causing those strange artitacts that appears on the later screenshot?

It apears as if the triangles on the back are overlapping those of the front

It occurs some times thought, as the artifats are jerky, it's like if there is "z-fighting", but triangles on the back have z values below of those for triangles on the front

Here is an image of the vertices and normals z arrangement

enter image description here

The blue arrows are normals shared by the surrounding faces, and the triangle with red lines is a representation of what could be causing those artifacts

War es hilfreich?

Lösung

it's like if there is "z-fighting", but triangles on the back have z values below of those for triangles on the front

It doesn't matter so much that one has z-value less than the other, you get z-fighting when your objects are too close together and you don't have enough z resolution.

The problem here I guess is that you set your projection range too large, from 0.1 to 1000. The greater magnitude the difference between these numbers, the less z-resolution you will get.

I recommend to try near/far of 0.1/100, or 1.0/1000, as long as that works with your application. It should help your z-fighting issue.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top