2

私の目標は、パース ビューでライティングをスムーズにすることです。遠近法と正投影の両方に同じライト設定を使用しています。以下の画像は、正投影照明が素晴らしく見えることを示しています。パースペクティブ ライティングを回転させると、グリッチが発生し、ちらつきます。パースペクティブ ビューの照明を正常に見せるには何が欠けていますか?

プロセッサー: AMD FX 6100 6コア 3.31GHz

グラフィック: AMD Radeon HD 6800

注: OpenGL の例から参照しました。さまざまなライト設定で遊んで、それらがどのように機能するかを調べました。この投稿の最後に貼り付けたコードは、画像を作成したコードです。

視点: http://i.stack.imgur.com/pSXul.png

正書法: http://i.stack.imgur.com/Q7Yr2.png

これが私のペイントメソッド内の関連コードです。

private void glControl1_Paint(object sender, PaintEventArgs e)
{
    if (!glLoaded)
        return;

    GL.Enable(EnableCap.DepthTest);
    //GL.Enable(EnableCap.Blend);
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

    //SET PERSPECTIVE OR ORTHOGRAPHIC VIEW
    if (chkPerspective.Checked)
    {
        double aspect = glControl1.Width / (double)glControl1.Height;

        Matrix4 perspective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)aspect, 0.0001f, 5000.0f);
        GL.MatrixMode(MatrixMode.Projection);
        GL.LoadIdentity();
        GL.LoadMatrix(ref perspective);

        Matrix4 lookat = Matrix4.LookAt(eyeOffset.X, eyeOffset.Y, eyeOffset.Z, 0, 0, 0, 0, 1, 0);

        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadMatrix(ref lookat);


        //GL.Translate(-boxOffset);
    }
    else
    {
        setupViewPort(); //Orthographic settings
        GL.MatrixMode(MatrixMode.Modelview); 
        GL.LoadIdentity();
    }

    GL.Rotate(angleY, 1.0f, 0, 0);
    GL.Rotate(angleX, 0, 1.0f, 0);

    //LIGHTING
    if (chkLighting.Checked)
    {
        float[] mat_specular = { 1.0f, 1.0f, 1.0f, 1.0f };
        float[] mat_shininess = { 50.0f };
        float[] light_position = { 1000.0f, 1000.0f, 1000.0f, 100.0f };
        float[] light_ambient = { 0.5f, 0.5f, 0.5f, 1.0f };

        GL.ClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        //GL.ShadeModel(ShadingModel.Smooth);

        //GL.Material(MaterialFace.Front, MaterialParameter.Specular, mat_specular);
        //GL.Material(MaterialFace.Front, MaterialParameter.Shininess, mat_shininess);
        GL.Light(LightName.Light0, LightParameter.Position, light_position);
        //GL.Light(LightName.Light0, LightParameter.Ambient, light_ambient);
        //GL.Light(LightName.Light0, LightParameter.Diffuse, mat_specular);

        GL.Enable(EnableCap.Lighting);
        GL.Enable(EnableCap.Light0);
        GL.Enable(EnableCap.ColorMaterial);
        //GL.Enable(EnableCap.CullFace);
    }
    else
    {
        GL.Disable(EnableCap.Lighting);
        GL.Disable(EnableCap.Light0);
    }

    foreach (Cube cube in cubes)
    {
        cube.drawCube(selectionCubeRadius);
    }

    glControl1.SwapBuffers();
}


重要な場合に備えて、正投影ビューポート コードを次に示します。

private void setupViewPort()
{
    if (chkPerspective.Checked)
        return;

    int w = glControl1.Width;
    int h = glControl1.Height;
    GL.MatrixMode(MatrixMode.Projection);
    GL.LoadIdentity();
    GL.Ortho(-w, w, -h, h, -5000, 5000); // Bottom-left corner pixel has coordinate (0, 0)
    GL.Viewport(0, 0, w, h); // Use all of the glControl paintingarea
}
4

2 に答える 2

1

画像のみに基づくと、深度テストが無効になっているか、一部の法線が反転しているか、正規化されていないようです。

drawCube は正確に何をしますか?

于 2012-05-28T04:13:17.470 に答える
0

今のところうまくいく解決策を見つけました。透視図で、立方体のサイズを 200.0 から 5.0 に縮小しました。次に、カメラを近づけて、同じサイズに見えるようにしました。遠近法視野を作成するときは、遠方の Z 平面を減らすべきだという意見もありました。

モデルのサイズを小さくすることはうまくいきましたが、慣例の目的で遠方の z 平面の距離も小さくしました。また、現在のモデルのサイズと角度に基づいて使用する z 平面距離を決定するアルゴリズムも作成する予定です。

ユーザー 'dflemstr' が私の GL.Normal3f 呼び出しについて尋ねました。答えは、私には何もないということです。彼らは何をしますか、そして彼らは必要ですか?

于 2012-05-28T17:49:21.137 に答える