2017-03-16 158 views
1

我想寫我的着色器並添加光源,我有點想通了,做了它。Three.js着色器pointLight位置

但是有一個問題,光源的位置錯誤地確定,當相機旋轉或移動時,會發生一些不可思議的事情。

所以我得到的頂點着色器

vec3 vGlobalPosition = (modelMatrix * vec4(position, 1.0)).xyz 

現在我試圖使照明區域

float lightDistance = pointLights[ i ].distance; 
vec3 lightPosition = pointLights[ i ].position; 

float diffuseCoefficient = max( 
    1.0 - (distance(lightPosition,vGlobalPosition)/lightDistance), 0.0); 

gl_FragColor.rgb += color.rgb * diffuseCoefficient; 

的位置,但正如我前面寫的,如果你旋轉的攝像頭,照明區域移動到不同的位置。

我手動設置了燈光位置,一切都變得正常了。

vec3 lightPosition = vec3(2000,0,2000); 
... 

問題是如何獲得光源的正確位置?我需要一個全球性的位置,我不知道光源中包含的是什麼位置。

增加了一個例子:http://codepen.io/korner/pen/XMzEaG

+0

你可以製作一個演示問題的小提琴或codepen嗎? – gromiczek

+0

@gromiczek,請不要讓人們使用codepen或jsfiddle。 **把代碼放在問題本身。如果您想運行,請使用[一個片段](https://stackoverflow.blog/2014/09/16/introducing-runnable-javascript-css-and-html-code-snippets/)** – gman

+0

添加了一個示例: http://codepen.io/korner/pen/XMzEaG – user2783211

回答

0

你的問題在於vPos。目前,你這樣做:

vPos = (modelMatrix * vec4(position, 1.0)).xyz 

相反,你需要乘以位置modelViewMatrix

vPos = (modelViewMatrix * vec4(position, 1.0)).xyz; 

您需要使用modelViewMatrix因爲PointLight.position是相對於相機。

+0

謝謝,幫助,但造成了另一個問題)是否有可能轉換爲全球職位?因爲我做了一個霧,並使用'modelMatrix' – user2783211

+0

不客氣!在目前的例子中,我沒有看到任何霧,所以不要混淆評論。相反,我會鼓勵您創建一個新問題。 :) – Vallentin

+0

請看看這篇文章,也許你可以再次幫助我:) http://stackoverflow.com/questions/42873013/three-js-shader-pointlight-to-global-position – user2783211