使用 OpenGL 法线进行矩阵转换
我正在 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)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我怀疑你的法线很好,但你没有正确更新你的灯光位置和/或方向。请查看 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.