我正试图从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是必需的,但会导致错误.
如果你想使用场景灯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