我使用的 OpenGL 没有弃用的功能,我的光计算是在片段着色器上完成的。所以,我正在做平滑着色。
我的问题是,当我绘制立方体时,我需要平面法线。我所说的平面法线是指在一张脸上生成的每个片段都具有相同的法线。
到目前为止,我对此的解决方案是为每个面生成不同的顶点。所以,现在我有 24(6*4) 个顶点,而不是 8 个顶点。
但这对我来说似乎是错误的,复制顶点。有没有更好的方法来获得平坦的法线?
更新:我使用的是 OpenGL 3.3.0 版,尚不支持 OpenGL 4。
最佳答案
如果在相机空间中进行照明,则可以使用 dFdx/dFdy 从顶点的相机空间位置计算面部的法线。
所以片段着色器看起来有点像这样。
varying vec3 v_PositionCS; // Position of the vertex in camera/eye-space (passed in from the vertex shader)
void main()
{
// Calculate the face normal in camera space
vec3 normalCs = normalize(cross(dFdx(v_PositionCS), dFdy(v_PositionCS)));
// Perform lighting
...
...
}
关于opengl - 如何在立方体上获得平坦的法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14980712/