opengl - 着色器变量归一化职责

标签 opengl glsl shader

让我们假设在我们想要通过片段着色器的顶点着色器中有几个向量变量(例如光方向、相机方向和顶点法线)。

我知道着色器向量变量在使用它们进行进一步计算之前应该被归一化。
特别是向量,如顶点法线,每个片段可能会改变,应该首先在顶点着色器中进行标准化。

我想知道哪些变量不需要在片段着色器中标准化,以便我可以节省一些计算。

最佳答案

我试图对这个有点模糊的问题给出一个一般性的答案。

您当然必须对任何需要具有单位长度的向量进行归一化以进行进一步计算。在经典的基于 phong 的照明计算的上下文中,这些包括所有方向向量,因为真正要计算的是方向之间角度的余弦,这将等于单位长度向量的点积。

在这种情况下,值得注意的是,每个片段的变量插值不会保留向量长度。所以你必须在片段着色器中重新归一化向量,即使顶点着色器输出已经归一化。而且你也不能保存每个顶点的归一化步骤:如果你插入不同长度的向量,你会引入某种权重,增加较长向量的影响。所以你必须确保你的顶点着色器输出被归一化,并且必须在片段着色器中再次重新归一化它们。

关于opengl - 着色器变量归一化职责,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27463114/

相关文章:

image - 为什么 OpenGL 不能正确显示我加载的图像?

c++ - 设置不对称截锥体

opengl - 非单调深度缓冲区; OpenGL 中的循环重叠

c++ - OpenGL - 在倾斜的桌面上移动球

c++ - 忽略某些颜色 Alpha 混合

opengl - glBlendEquationSeparate 和 glBlendFuncSeparate - 片段着色器实现

c++ - 在 OpenGL 中动态加载着色器毫无意义吗?

opengl - 编译着色器失败,我需要英特尔平台上的 ubuntu 的 openGL 驱动程序吗?

c++ - 如何清除opengl着色器缓存

graphics - 使用 2D 元球绘制具有恒定厚度的轮廓