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) の 2 つのスクリーンショットです。

iPod Touch 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ファイティングの問題に役立つはずです。

于 2012-10-15T04:40:50.773 に答える