2013-03-27 94 views
1

我正在开发webgl中的卷绘制应用程序,最后我要做的是创建光照模型。我已准备好了一切,但我无法在场景中找到灯光位置。我加入光这样:自定义着色器中的光线位置(着色器材质)

var light = new THREE.DirectionalLight(0xFFFFFF, 1); 
light.position.set(0.5, 0.5, 0.1).normalize(); 
camera.add(light); 

附上光相机,因为我需要轻静若我与移动相机。 问题是,我使用ShaderMaterial(自定义着色器)。我无法找到代表明亮位置的任何统一变量。我已搜索,我应该设置:

material.lights = true; 

但它造成的错误。我试图在顶点着色器中添加常量向量,但我需要乘以反向视图矩阵(如果我是正确的)。但GLSL 1.0不支持反转功能。我有想法通过统一发送逆向视图矩阵着色器,但我不知道我在哪里可以得到在JS中的场景视图矩阵。

感谢您的帮助。我已经试过各种:(...

再见。

回答

2

如果你要光添加为相机的孩子,并设置material.lights = true,那么你就必须添加的摄像机作为场景的孩子。

scene.add(camera); 

three.js所r.57

+0

我已经将相机添加到了场景中,就像你写的一样。问题仍然存在。还有就是堆的错误: 遗漏的类型错误:无法设置未定义three.js所的特性 '值':23486 refreshUniformsLights three.js所:23486个 setProgram three.js所:23204个 渲染three.js所:21576 renderObjects three.js所:22248 render Three.js:22122 refreshScene – Xrew 2013-03-27 15:12:20

+0

好的,我有更多的问题...我必须从兰伯特材料复制制服变量:-)错误消失.. – Xrew 2013-03-27 16:29:46

+0

我已经改变了灯聚光灯和打印制服对象。有可变的spotLightPosition ...但如果我想从着色器中的这个制服重新出发,比错误发生......任何想法? – Xrew 2013-03-27 16:39:03

1

如果你想投射光从模型空间坐标系到屏幕空间使用相机时,这里是一个函数(蒂博Despoulain提供),可以帮助 -

var projectOnScreen = function(object, camera) 
{ 
var mat = new THREE.Matrix4(); 
mat.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld); 
mat.multiplyMatrices(camera.projectionMatrix , mat); 

var c = mat.n44; 
var lPos = new THREE.Vector3(mat.n14/c, mat.n24/c, mat.n34/c); 
lPos.multiplyScalar(0.5); 
lPos.addScalar(0.5); 
return lPos; 
}