2017-05-23 34 views
1

我正在寫一個着色器,我需要以某種方式將參數傳遞給它。 在代碼中我找到了一些結構,但我不明白它是如何工作的。Three.js如何在着色器中使用你的結構?

struct Light { 
    vec4 position; 
    vec4 ambient; 
    vec4 diffuse; 
    vec4 specular; 
    vec3 spotDirection; 
    float spotCutOff; 
    float constantAttenuation; 
    float linearAttenuation; 
    float quadraticAttenuation; 
    float spotExponent; 
    float spotLightCosCutOff; 
}; 
uniform Light lights[numLights]; 

如何在我的着色器中設置我的結構?

+0

給我提出的問題前一段時間類似:https://stackoverflow.com/questions/38833195/shaders-structs對於結構的陣列,它的字面如設置簡單統一到一個對象數組。 – TheJim01

+0

我試圖做的事情,但仍然不能解決,這裏有一個例子:http://jsfiddle.net/546syLur/13/(必須有一個白色方塊) – user2783211

回答

2

Light的每個項目的每個字段array'll是一個單獨的統一:

gl.uniform4f(gl.getUniformLocation(program, 'lights[0].position'), 1, 1, 1, 1); 
gl.uniform1f(gl.getUniformLocation(program, 'lights[3].spotCutOff'), 3); 

@ TheJim01指出,你的問題是three.js所特定的(感謝:)。有同樣的原則表示:

yourShaderMaterial.uniforms['lights[0].spotCutOff'].value = 3; 
+0

這對原始WebGL很好,但是問題涉及THREE.js,它通過易於使用的函數調用和屬性來模糊gl調用。 – TheJim01

+0

@ TheJim01我修改了答案:) –

+0

我嘗試做的事情,但仍然不能解決,這裏是一個例子:http://jsfiddle.net/546syLur/13/(必須有一個白色方塊) – user2783211