我需要用OpenGL创建椭圆。我发现这样做的最简单方法是使用带有gluDisk(...)
的 GLUquadric ,它会生成一个圆形磁盘,以及glScale(...)
将磁盘变成椭圆形。这种方法唯一明显的问题是,gluDisk
生成的法向量在调用glScale
后将停止标准化。
这会以任何方式影响光照吗?在这种情况下,OpenGL定义的行为是什么?向量是自动重新规范化的,行为是未定义的,还是其他的?
答案 0 :(得分:5)
这会对照明产生(坏)影响。预期法线向量的长度为1,如果不是,则照明可能比预期更强/更弱。依赖于点积和正常值的值显然是不正确的。简而言之,要么确保手动规范化法线,要么使用GL_NORMALIZE。除非使用GL_NORMALIZE,否则OpenGL将假设您提供的法线已经标准化。如果它们没有标准化,则不会出现“错误”。如果您决定使用GL_NORMALIZE,那么每帧将有额外的计算成本。如果性能成为一个问题,请小心谨慎。无论如何,使用GL_NORMALIZE可能正是您正在寻找的。 p>
答案 1 :(得分:2)
您可以使用glEnable(GL_NORMALIZE)
自动将其标准化。或者在着色器中标准化它们(如果有的话)。