2013-03-27 58 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; 
}