0

私は OpenGL でジオメトリを扱っており、現在は照明を扱っています。ジオメトリを変換すると、法線が追従せず、役に立たないことに気付きました。

どのように変換マトリックスをジオメトリに適用し、法線を維持しますか?

現在、次のコードを使用しています。

        GL.PushMatrix();

        if (Offset != null)
        {
            GL.Translate(Offset.X, Offset.Y, Offset.Z);
        }
        GL.Begin(BeginMode.Triangles);
        foreach (var face in Faces)
        {
            foreach (var i in face)
            {
                var point = Points[i - 1];
                GL.Normal3(point);
                GL.Vertex3(point);
            }
        }
        GL.End();
        GL.PopMatrix();

ジオメトリにオフセットを与えると、適切にレンダリングされません (たとえば、法線が正しくマップされません。

どんな助けでも素晴らしいでしょう。

ps、私は OpenTK ラッパーを使用していますが、通常の OpenGL は直接変換されます。

編集:

上記のコードを次のように変更すると、わかりました。

        GL.PushMatrix();

        //if (Offset != null)
        //{
        //    GL.Translate(Offset.X, Offset.Y, Offset.Z);
        //}
        GL.Begin(BeginMode.Triangles);
        foreach (var face in Faces)
        {
            foreach (var i in face)
            {
                var point = Points[i - 1];
                if (Offset == null)
                {
                    GL.Normal3(point);
                    GL.Vertex3(point);
                }
                else
                {
                    var pt = new Vector3d(Offset.X + point.X, Offset.Y + point.Y, Offset.Z + point.Z);
                    GL.Normal3(pt);
                    GL.Vertex3(pt);
                }
            }
        }
        GL.End();
        GL.PopMatrix();

すべてが正常にレンダリングされます。

ここにいくつかのスクリーンショットがあります(コードに応じて)

シェーディングが機能しない シェーディング作業

4

1 に答える 1

0

法線は問題ないと思いますが、ライトの位置や方向を適切に更新していません。OpenGL FAQ Chapter 18、特に 18.050 を確認してください。

于 2011-04-07T20:20:35.277 に答える