在three.js着色器中使用灯光

tur*_*ics 2 shader three.js

我正试图从three.js中的着色器访问场景的灯光.

这个问题几乎与Three.js ShaderMaterial问题重复,但对该问题 的评论并没有帮我解决问题.

这是顶点着色器:

#if NUM_DIR_LIGHTS > 0
    struct DirectionalLight {
        vec3 direction;
        vec3 color;
        int shadow;
        float shadowBias;
        float shadowRadius;
        vec2 shadowMapSize;
     };
     uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];
#endif
  varying vec3 color;
  void main() {
     float r = directionalLights[0].color.r;
     color = vec3(r,1.0,0.0);
     gl_Position = projectionMatrix * modelViewMatrix * vec4(position , 1.0);
  }
Run Code Online (Sandbox Code Playgroud)

和相关的ShaderMaterial:

var material = new THREE.ShaderMaterial({
    uniforms: THREE.UniformsLib['lights'],
    vertexShader: document.getElementById('vertexShader').innerHTML,
    fragmentShader: document.getElementById('fragmentShader').innerHTML,
    lights : true
  });
Run Code Online (Sandbox Code Playgroud)

我在这里发布了整个示例代码:https://jsfiddle.net/zhkvcajs/

删除lights : true呈现绿色结,但它没有得到directionalLights应该改变结的颜色的信息.显然,这lights : true是必需的,但会导致错误.

Wes*_*ley 8

如果你想使用场景灯ShaderMaterial,除了设置lights: true,你需要使用这种模式创建你的制服:

var uniforms = THREE.UniformsUtils.merge( [

    THREE.UniformsLib[ "ambient" ],
    THREE.UniformsLib[ "lights" ]

] );

var material = new THREE.ShaderMaterial( {
    uniforms: uniforms,
    vertexShader: document.getElementById('vertexShader').innerHTML,
    fragmentShader: document.getElementById('fragmentShader').innerHTML,
    lights: true
} );
Run Code Online (Sandbox Code Playgroud)

更新小提琴:https://jsfiddle.net/zhkvcajs/3/

three.js r.74

  • 固定在r.75dev."环境"制服已合并成"灯"制服. (2认同)