2012-10-11 65 views
1

這是我的片段着色器,包含uniformWebGLUniformLocation對象的屬性是什麼?

precision highp float; 

uniform sampler2D uSampler; 
varying vec2 vPosition; 

void main() { 
    gl_FragColor = texture2D(uSampler, vPosition); 
} 

現在,我調用該函數getUniformLocation

var uniformLocation = gl.getUniformLocation(program, 'uSampler') 

我得到一個WebGLUniformLocation與連接到它看似無屬性:

for(a in uniformLocation) { console.log(a); } // prints no results 

爲什麼WebGLUniformLocation對象財產的?

回答

4

一個WebGLUniformLocation僅僅是一個不透明的句柄均勻,這樣就可以設置統一的位置。在真正的OpenGL中,統一的位置是整數。不幸的是,許多程序員會對這些整數進行數學運算。例如,他們可能會做這樣的事情

//--shader-- 
uniform float a; 
uniform float b; 
... 

// C 
GLint location_a = glGetUniformLocation(program, "a"); 
GLint location_b = a + 1; // ILLEGAL BUT MIGHT WORK ON SOME CARDS 

同樣,他們可以這樣做

//--shader-- 
uniform float a[2]; 
... 

// C 
GLint location_a0 = glGetUniformLocation(program, "a[0]"); 
GLint location_a1 = a + 1; // ILLEGAL BUT MIGHT WORK ON SOME CARDS 

或者他們可以做到這一點

//--shader #1-- 
uniform float a; 
... 

//--shader #2-- 
uniform float a; 
... 


// C 
GLint program_1 = CompileShadersAndLinkProgram(shader_1_src, ..); 
GLint program_2 = CompileShadersAndLinkProgram(shader_2_src, ..); 

// Get the location from program 1 
GLint location_a = glGetUniformLocation(program_1, "a"); 

// Use a location from program 1 with program 2 
glUseProgram(program_2); 
glUnform1f(location_a, 123); // ILLEGAL BUT MIGHT WORK ON SOME CARDS 

所有這些都是非法的,錯按了OpenGL規範。有時候沒關係。如果你正在寫一些OpenGL的程序,你只需要它自己的機器上工作或者一些固定的硬件,那麼你可能不關心,如果它是錯的,如果它發生在工作。

對於WebGL的,雖然這還不夠好。如果可能的話,您希望編寫一次代碼並將其運行到任何地方。爲了預防這類錯誤的WebGL返回WebGLUniformLocation,讓你不能做任何的數學,你不能在另一個程序使用一個程序的位置。

+1

非常有幫助。我以爲自己的位置值得到了錯誤的結果,直到我讀到這個 –

相關問題