我已经制作了一个GLSL着色器,用于在场景中进行每像素blinn phong照明,并且我在场景中投射了一些问题。每个灯光的效果似乎都有一个非常坚硬的边界(在附加的截图中,你可以看到底部平面上的光线边界 - 光线(其世界位置相当于场景中悬挂的黑色球体)悬在上面飞机和法拉利模型,但由于某种原因,只能将光线适当地朝向/朝向相机,而不是向前,远离相机。
我觉得我犯了一些错误/对眼睛方向如何影响blinn phong照明模型缺乏了解。我搞砸了我的计算,还是我根本不明白这个特定的照明模型应该如何工作?
我的着色器代码在这里:https://gist.github.com/1040417
效果截图:
答案 0 :(得分:2)
你对半矢量的计算似乎是错误的。半矢量是光方向和视图方向(相机方向)之间的矢量,也是眼睛方向影响照明的部分。但是,由于您在世界空间而非视图空间中计算照明,因此您不能仅将视图空间位置用作眼睛方向,而是需要将世界空间中的查看器/摄像机的位置作为着色器的输入。哦,不要忘记在计算半矢量之前标准化光矢量(并且还插入标准化光矢量)。所以替换
halfVectors[i] = normalize(lights.allLights[i].position + lightDirections[i]);
与
uniform vec3 viewerPos;
...
vec3 eyeDirection = normalize(viewerPos - worldPosition.xyz);
...
lightDirections[i] /= dist;
halfVectors[i] = normalize(eyeDirection + lightDirections[i]);
应该做的伎俩。眼睛方向不再需要变化,因为片段着色器中不需要它(它隐含地保存在半矢量中)。
我不确定插值半矢量是否与插入眼睛方向和计算片段着色器中的半矢量的结果完全相同(这样你也可以省去许多变化)。但至少它现在应该有效。
编辑:与衰减系数相同。由于它与光线的距离是非线性的,因此您可能得不到与每个片段计算完全相同的结果。但这可能是可以忍受的,因此会影响镶嵌质量。