为什么我的3d产品在另一个方向上变黑?

时间:2017-08-27 01:47:06

标签: c++ opengl glsl lighting

这是我目前的片段着色器的主要内容。如果我在灯光计算中不使用lightDot,那么灯光就是一个漂亮的圆形,在每个方向均匀地褪色。但是,一旦我添加lightDot,它似乎使对象的另一半只是黑色。

Screenshot

据我所知,当世界位置和光线之间的角度接近表面法线时,点积应该使光线变亮,并且当角度越大时,光线越暗。

void main()
{
    vec3 lightDir=normalize(lightPosition-worldPosition);

    float lightDot=dot(worldNormal,lightDir);
    float dist=distance(lightPosition,worldPosition);
    vec3 light=lightDot*materialDiffuse/(dist*dist);

    fragmentColor=vec4(pow(light.x,gamma),pow(light.y,gamma),pow(light.z,gamma),1);
}

2 个答案:

答案 0 :(得分:1)

点积已签名。只需插入一些值:

(0,1) dot (0,1) = 1
(0,-1) dot (0,1) = -1

通常在着色器中,您将其钳制为0,因为我们正在尝试近似不能为负的入射光。

答案 1 :(得分:0)

问题实际上是模型导入器在几何体上交换Y轴和Z轴而不是法线。我想通过想知道为什么X轴在一个方向上移动会减少点积,就好像它正在远离法线一样。