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 第 18 章,尤其是 18.050。

于 2011-04-07T20:20:35.277 回答