我正在尝试从three.js的着色器中访问场景灯光。
这个问题与Three.js ShaderMaterial issue with lights几乎重复,但是那个问题的评论没有帮助我解决问题。
下面是顶点着色器:
我已经将整个示例代码发布在这里:https://jsfiddle.net/zhkvcajs/ 去除
这个问题与Three.js ShaderMaterial issue with lights几乎重复,但是那个问题的评论没有帮助我解决问题。
下面是顶点着色器:
#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);
}
以及相关的着色器材质(ShaderMaterial):
var material = new THREE.ShaderMaterial({
uniforms: THREE.UniformsLib['lights'],
vertexShader: document.getElementById('vertexShader').innerHTML,
fragmentShader: document.getElementById('fragmentShader').innerHTML,
lights : true
});
我已经将整个示例代码发布在这里:https://jsfiddle.net/zhkvcajs/ 去除
lights: true
会呈现一个绿色的节点,但是它无法获取应更改节点颜色的directionalLights
信息。 显然,需要lights:true
来实现该功能,但会导致错误。
THREE.UniformsLib [“lights”]
作为 uniform,但没有包含THREE.UniformsLib [“ambient”]
。很明显,除了灯光之外,使用灯光还需要其他东西,这种设计看起来并不是很易于发现。如果您不能在没有环境光的情况下使用灯光,那么为什么环境光uniforms不直接包含在灯光uniforms中呢? - turtlegraphics