我需要用 OpenGL 创建椭圆。我发现执行此操作的最简单方法是使用 GLUquadric 和 gluDisk(...)
,它生成一个圆盘,以及 glScale(.. .)
将圆盘变成椭圆。此方法唯一明显的问题是,一旦调用 glScale
,由 gluDisk
生成的法 vector 将停止归一化。
这会以任何方式影响光照吗?在这种情况下,OpenGL 定义的行为是什么? vector 是否自动重新归一化,行为是否未定义,还是其他原因?
最佳答案
这会对照明产生(不良)影响。预计法线 vector 的长度为 1,如果不是,则光照可能比预期的强度更高/更低。依赖于法线点积的值显然是不正确的。简而言之,要么确保手动规范化法线,要么使用 GL_NORMALIZE。除非使用 GL_NORMALIZE,否则 OpenGL 将假设您给它的法线已经标准化。如果不规范化,就不会有“错误”。如果您决定使用 GL_NORMALIZE,那么每帧都会有额外的计算成本。因此,如果性能将成为一个问题,请小心。无论如何,使用 GL_NORMALIZE 可能正是您此时正在寻找的东西。
关于c++ - 在 OpenGL 中未规范化的法 vector 有什么行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155739/