2012-02-06 41 views
1

我需要用OpenGL创建椭圆。我发现最简单的方法是使用一个GLUquadricgluDisk(...),它会产生一个圆形的磁盘,以及glScale(...)将磁盘转成椭圆形。该方法唯一明显的问题是,调用glScale后,由gluDisk生成的法向矢量将不再标准化。在OpenGL中未标准化的法向量的行为是什么?

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

回答

5

这会对照明产生(坏)影响。预计法向量的长度为1,如果不是,照明可能比预期的更强烈/更不强烈。依赖点积与正常值的值显然是不正确的。总之,要么确保手动标准化法线或使用GL_NORMALIZE。 OpenGL将假设你给它的法线已经标准化,除非使用GL_NORMALIZE。如果它们没有被标准化,将不会有“错误”。如果你决定使用GL_NORMALIZE,那么每帧都会有额外的计算成本。因此,如果性能将成为问题,请谨慎行事。无论如何,使用GL_NORMALIZE可能正是您在这一点上所需要的。

2

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

相关问题