2011-11-20 55 views
3

我一直在試圖製作一個結構,它將包含我的WebGL應用程序的所有燈光,並且有麻煩設置它是來自JS的值。結構如下:將結構數組的值設置爲從JS到GLSL

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]; 

測試的事情,我做它的工作地段後,但我不是很滿意我寫的代碼:

program.uniform.lights = []; 
    program.uniform.lights.push({ 
     position: "", 
     diffuse: "", 
     specular: "", 
     ambient: "", 
     spotDirection: "", 
     spotCutOff: "", 
     constantAttenuation: "", 
     linearAttenuation: "", 
     quadraticAttenuation: "", 
     spotExponent: "", 
     spotLightCosCutOff: ""   
    }); 


      program.uniform.lights[0].position = gl.getUniformLocation(program, "lights[0].position"); 
      program.uniform.lights[0].diffuse = gl.getUniformLocation(program, "lights[0].diffuse"); 
      program.uniform.lights[0].specular = gl.getUniformLocation(program, "lights[0].specular"); 
      program.uniform.lights[0].ambient = gl.getUniformLocation(program, "lights[0].ambient"); 

    ... and so on 

我讓你們看看對不起這段代碼,我知道這很可怕,但我找不到更好的方法。

有沒有一個標準或推薦的方法來正確地做到這一點?任何人都可以啓發我嗎?

回答

8

你做得對。你可以嘗試收緊它有點

lightLocations = [ 
    "position", 
    "diffuse", 
    "specular", 
    "ambient", 
    "spotDirection", 
    "spotCutOff", 
    "constantAttenuation", 
    "linearAttenuation", 
    "quadraticAttenuation", 
    "spotExponent", 
    "spotLightCosCutOff", 
]; 

var program = { 
    uniform: { 
    lights: []; 
    } 
}; 

for (var ll = 0; ll < numLights; ++ll) { 
    var locations = { }; 
    for (var jj = 0; jj < lightLocations.length; ++jj) { 
    var name = lightLocaitons[jj]; 
    locations = gl.getUniformLocation(program, "lights[" + ll + "]." + name); 
    } 
    program.uniform.lights[ll] = locations; 
} 
+0

現在我使用「eval」函數來實現它,但我會嘗試兩個實現,並檢查出最快的一個。我必須說你的看起來非常乾淨!謝謝! –