在Three.js的自定义着色器中定义定向光的方向

时间:2017-03-23 02:59:03

标签: three.js

我目前正在使用Three.js实现自定义着色器,但仍然不了解THREE.DirectionalLight方向的定义。

例如,如果我以这种方式添加定向光源:

var directionalLight = new THREE.DirectionalLight( "white", 1. );
directionalLight.position.set(0,1,0);
scene.add( directionalLight );

定向光定义为从(0,0,0)到(0,1,0)``。我使用内置材料来确认这一点,但我仍然不确定方向如何传递到着色器。

在我的自定义素材中,我使用THREE.RawShaderMaterialTHREE.UniformsLib["lights"]将制服传递到着色器。在着色器中,我正在写

#if NUM_DIR_LIGHTS > 0

    struct DirectionalLight {
        vec3 direction;
        vec3 color;
    };

    uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];

#endif

使用DirectionalLight的制服。

直观地说,我假设vec3 direction是从光源指向目标的矢量,它应该是(0,-1,0)。但是,如果我在GLSL代码中输出方向值,则方向为(0,1,0),这是从目标指向光源的向量。

有没有记录这个定义的地方?如果有人能指出Three.js如何将DirectionalLight的制服传递给源代码中的着色器,那将是很棒的。然后,我将能够理解Three.js的开发人员如何决定定义DirectionalLight的方向。

1 个答案:

答案 0 :(得分:1)

让我们看一下blinn-phong着色的图表:

enter image description here

我们会注意到L矢量指向远离表面并朝向光源。如果我们说法线指向远离表面是直观的,那么光矢量应该是为了使数学运算。

考虑一个点光源,它没有方向但是是空间中的一个点。您如何计算特定片段或顶点的方向?你可能倾向于说光照在片段上:

 fragLightDir = fragPos - lightPos 

但它应该是

 fragLightDir = lightPos - fragPos
  

定向光定义为从(0,0,0)到(0,1,0)``。

实际上不是,它更像是光源位于(0,1,0)指向原点(因为dir光只是一个方向)。

我真的不确定阴影是如何工作的,我认为它们实际上与dir光无关,而且它只是一个可以移动的正交相机。没有阴影,“移动”光线没有多大意义,而是将它放置在某个地方,它始终朝向原点闪耀,并在引擎盖下进行标准化。