首页 文章

奇怪的结果w / Blinn-Phong GLSL着色器,点光源

提问于
浏览
1

我已经制作了一个GLSL着色器,用于在场景中进行每像素的blinn phong照明,并且我在场景中投射了一些问题 . 每个灯光的效果似乎都有一个非常坚硬的边界(在附加的截图中,你可以看到底部平面上的光线边界 - 光线(其世界位置相当于场景中悬挂的黑色球体)悬在上面飞机和法拉利车型,但由于某种原因,只能将光线适当地朝向/朝向相机,而不是向前,远离相机 .

我觉得我犯了一些错误/缺乏对眼睛方向如何影响blinn phong照明模型的理解 . 我搞砸了我的计算,还是我根本不明白这个特定的照明模型应该如何工作?

我的着色器代码在这里:https://gist.github.com/1040417

效果截图:
Light boundary cutoff on scene

1 回答

  • 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]);
    

    应该做的伎俩 . 眼睛方向不再需要变化,因为它在片段着色器中不需要(它隐含地保存在半矢量中) .

    我不确定插值半矢量是否与插入眼睛方向和计算片段着色器中的半矢量具有完全相同的结果(这样你也可以省去许多变化) . 但至少现在应该可以了 .

    EDIT: 与衰减系数相同 . 因为它与光的距离是非线性的,所以你可能得不到与每个片段计算它时完全相同的结果 . 但它可能是可以忍受的,并且依赖于镶嵌质量 .

相关问题