使用 OpenGL 法线进行矩阵转换

发布于 2024-10-30 18:42:52 字数 1669 浏览 4 评论 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();

都会呈现良好。

好的,如果我

一切 src="https://i.sstatic.net/Q0tNH.png" alt="着色不起作用"> 着色工作

I'm working with geometry in OpenGL and I'm now working with lighting. I'm noticing that if I translate my geometry, the normals don't follow and are thus useless.

How do you apply a tranformation matrix to geometry and maintain the normals?

Currently I'm using the following code:

        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();

When I give the geometry an offset, it doesn't render properly (e.g. the normals don't map correctly.

Any help would be excellent.

p.s., I'm using the OpenTK wrapper, but regular OpenGL translates directly across.

EDIT:

Ok, if I change the above code to the following:

        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();

everything renders fine.

Here are some screenshots (respective to their code)

Shading not working
Shading working

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冰之心 2024-11-06 18:42:52

我怀疑你的法线很好,但你没有正确更新你的灯光位置和/或方向。请查看 OpenGL FAQ 第 18 章,特别是 18.050。

I suspect your normals are fine, but you aren't properly updating your light position and/or direction. Check out the OpenGL FAQ Chapter 18, 18.050 in particular.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文