lightDirection
是平行光的方向,统一传递到片段着色器中。- 顶点着色器中传递了法线和位置数据。
- 片段着色器中使用
dot(vNormal, lightDirection)
计算了光照的扩散强度diff
// 定义平行光方向
const lightDirection = new THREE.Vector3(0, 0, 1);// 顶点着色器
const vertexShader = `varying vec3 vNormal;varying vec3 vPosition;void main() {vNormal = normalize(normal);vPosition = (modelViewMatrix * vec4(position, 1.0)).xyz;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}`;// 片段着色器
const fragmentShader = `uniform vec3 lightDirection;varying vec3 vNormal;varying vec3 vPosition;void main() {// 平行光计算float diff = max(dot(vNormal, normalize(lightDirection)), 0.0);vec3 color = vec3(1.0, 0.5, 0.3) * diff;gl_FragColor = vec4(color, 1.0);}`;// 创建ShaderMaterial
const material = new THREE.ShaderMaterial({uniforms: {lightDirection: { value: lightDirection },},vertexShader,fragmentShader,
});
如果要再增加点难度可以
* normalMatrix
vNormal = normalize(normalMatrix * normal);
lightDirection.setFromMatrixPosition( light.matrixWorld ); vector3.setFromMatrixPosition( light.target.matrixWorld ); lightDirection.sub( vector3 ); lightDirection.transformDirection( viewMatrix );