3

OpenGL (および GLFW ライブラリ) を使用して 3D オブジェクトをレンダリングしようとすると、モデルで多くのちらつきが発生します。.obj自分で書いたライブラリを使用してファイルを読んでいます。

以下は私のレンダリング関数です: 残念ながら、面と頂点がどのように入力されているかを理解するために、リンクされているすべてのコードを提供する必要があります: 圧縮されたコードと実行可能ファイルとサンプル.obj: ソース

ここから.obj ファイルを使用してプログラムをテストします。現在、プログラムは法線とテクスチャをサポートしていませんが、サイト上のほとんどのモデルには法線とテクスチャがないため、これは問題ではありません。また、(現在)「123.obj」からのみ読み取るため、ファイルに他の名前を付けないでください。また、スペースは 1 つだけで、それ以上は受け入れません。

 float render()
    {
        glfwSetTime(0.0f);
        int win_width;
        int win_height;
        glfwGetWindowSize(&win_width, &win_height);
        float win_aspect = (float)win_width / (float)win_height;
        glViewport(0, 0, win_width, win_height);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(90, win_aspect, 0, 100.0);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0, 0, 50.0, 0, 0, 0, 0.0, 1.0, 0.0);

        glEnable(GL_DEPTH);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_NORMALIZE); 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glRotatef(angle , 0 , 1, 0);
        glColor3f(0.0f, 0.0f, 0.0f);
        int index = 0;
        for(int a = 0; a < faces.size(); a++)
        {
            if(faces[a].vertices.size() == 3)
            {
                glBegin(GL_TRIANGLES);
            }
            else
            {
                glBegin(GL_QUADS);
            }
            for(int b = 0; b < faces[a].vertices.size(); b++)
            {
                index = faces[a].vertices[b];
                glVertex3f(vertices[index].Dimensions[_x], vertices[index].Dimensions[_y], vertices[index].Dimensions[_z]);
            }
            glEnd();
        }
        glfwSwapBuffers();
        return (float)glfwGetTime();
4

1 に答える 1

7

ここに問題があります

gluPerspective(90, win_aspect, 0, 100.0);

Nearclip として 0 を設定することはできません。0.1 や 1.0 などの大きな値に設定してください。

gluPerspective(90, win_aspect, 1.0, 100.0);

nearclip を 0 にすると、すべての深度が z = 1 にマッピングされ、z ファイティングが発生します。

編集:興味がある場合は、遠近法の深さに関するいくつかの理論があります:

カメラ x からの特定の距離に対して、透視変換は特定の深度値 z を出力します。farclip では、この値は 1 の最大値になり、nearclip では 0 になります。ただし、これらの値の間の関係は、予想されるように線形ではありません。曲線は次の図のようになります。

ダイアグラム

Nearclip を 0 に極端に設定すると、曲線が大きく歪むため、すべての距離が z = 1 にマップされます。

このような理由から、遠近比を 10000:1 よりも小さく保つように努める必要があります。

于 2011-10-20T19:55:07.070 に答える