我目前正在使用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.RawShaderMaterial
和THREE.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
的方向。
答案 0 :(得分:1)
让我们看一下blinn-phong着色的图表:
我们会注意到L矢量指向远离表面并朝向光源。如果我们说法线指向远离表面是直观的,那么光矢量应该是为了使数学运算。
考虑一个点光源,它没有方向但是是空间中的一个点。您如何计算特定片段或顶点的方向?你可能倾向于说光照在片段上:
fragLightDir = fragPos - lightPos
但它应该是
fragLightDir = lightPos - fragPos
定向光定义为从(0,0,0)到(0,1,0)``。
实际上不是,它更像是光源位于(0,1,0)指向原点(因为dir光只是一个方向)。
我真的不确定阴影是如何工作的,我认为它们实际上与dir光无关,而且它只是一个可以移动的正交相机。没有阴影,“移动”光线没有多大意义,而是将它放置在某个地方,它始终朝向原点闪耀,并在引擎盖下进行标准化。