在OpenGL中未规范化的法向量的行为是什么?

时间:2012-02-06 04:55:16

标签: c++ opengl

我需要用OpenGL创建椭圆。我发现这样做的最简单方法是使用带有gluDisk(...) GLUquadric ,它会生成一个圆形磁盘,以及glScale(...)将磁盘变成椭圆形。这种方法唯一明显的问题是,gluDisk生成的法向量在调用glScale后将停止标准化。

这会以任何方式影响光照吗?在这种情况下,OpenGL定义的行为是什么?向量是自动重新规范化的,行为是未定义的,还是其他的?

2 个答案:

答案 0 :(得分:5)

这会对照明产生(坏)影响。预期法线向量的长度为1,如果不是,则照明可能比预期更强/更弱。依赖于点积和正常值的值显然是不正确的。简而言之,要么确保手动规范化法线,要么使用GL_NORMALIZE。除非使用GL_NORMALIZE,否则OpenGL将假设您提供的法线已经标准化。如果它们没有标准化,则不会出现“错误”。如果您决定使用GL_NORMALIZE,那么每帧将有额外的计算成本。如果性能成为一个问题,请小心谨慎。无论如何,使用GL_NORMALIZE可能正是您正在寻找的。

答案 1 :(得分:2)

您可以使用glEnable(GL_NORMALIZE)自动将其标准化。或者在着色器中标准化它们(如果有的话)。