c++ - 在 OpenGL 中未规范化的法 vector 有什么行为?

标签 c++ opengl

我需要用 OpenGL 创建椭圆。我发现执行此操作的最简单方法是使用 GLUquadricgluDisk(...),它生成一个圆盘,以及 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/

相关文章:

c++ - 为什么 INT_MAX 减去 INT_MIN 等于 -1?

c++ - 堆栈上有多少个对象?

c++ - 在 Xcode 中将 C++ 与 OpenGL 结合使用

c++ - 光标方向 openGL C++

opengl - 桌面是否有最大的 libGDX 纹理大小?

c++ - 如何在 OpenCV 和 C++ 中找到图像中两个对象(点)之间的距离(以 m 和像素为单位)?

c++ - 如何修复 istringstream 编译器错误?

java - LWJGL OpenGL 将顶点传递给着色器

c++ - 关于循环和数组的练习 - 使用循环 1 次以及如何获取数组的最大值

c++ - 虚拟试衣间设计