2014-10-30 42 views
0

我試圖將我的JavaScript代碼中的制服變量傳遞給GSLS程序。但我得到這個警告,爲此,我期望的輸出不來了:GLSL程序錯誤 - WebGL

WebGL: INVALID_OPERATION: uniform3fv: location is not from current program 

還有就是我如何從我的JavaScript代碼初始化均勻值:

var lights = { 
    direction: [1.0, 1.0, 1.0], 
    color: [0.0, 1.0, 1.0] 
}; 

var u_LightColor = gl.getUniformLocation(program, 'u_LightColor'); 
var u_LightDirection = gl.getUniformLocation(program, 'u_LightDirection'); 

if (u_LightColor < 0) { 
    console.error("failed to get the storage location u_LightColor"); 
} 

if (u_LightDirection < 0) { 
    console.error("failed to get the storage location u_LightDirection"); 
} 

gl.uniform3fv(u_LightColor, lights.color); 
gl.uniform3fv(u_LightDirection, lights.direction); 

我的片段着色器代碼像這樣:

precision mediump float; 
    uniform vec3 u_LightColor; 
    uniform vec3 u_LightDirection; 
    uniform sampler2D diffuseMap; 
    varying mediump vec3 color; 
    varying vec2 tCoord; 
    varying vec3 n; 
    void main(void) { 

     vec3 normal = normalize(n); 
     float nDotL = max(dot(normalize(vec3(-5.0, -0.0, -5.0)), normal), 0.0); 
     diffuseVal = (u_LightColor) * diffuseVal * nDotL; 
     gl_FragColor = vec4(diffuseVal, 1.0); 
    } 

我不知道爲什麼我得到這個警告。儘管程序正在運行,但u_LightColoru_LightDirection的值未傳遞到片段着色器中;結果輸出全部變暗。另外要指出的是,在其中使用uniformSetter函數傳遞數據的GLSL程序中,我還有其他uniform變量;那些工作正常。

有人可以幫助我知道,爲什麼數據不在u_LightColoru_LightDirection

回答

2

撥打gl.uniform3fv之前撥打gl.useProgram(program)嗎?

制服是特定於節目的。換句話說,如果我製作2個着色器程序,即使它們使用的是完全相同的數據源,查找它們的位置也不可共享。

示例:給定這些函數始終使用相同的源。

function makeShader(type, source) { 
    var s = gl.createShader(type); 
    gl.shaderSource(s, source); 
    gl.compileShader(s); 
    return s; 
} 

function makeProgram() { 
    var vs = makeShader(gl.VERTEX_SHADER, vertexShaderSource); 
    var fs = makeShader(gl.FRAGMENT_SHADER, fragmentShaderSource); 
    var prg = gl.createProgram(); 
    gl.attachShader(vs); 
    gl.attachShader(fs); 
    gl.linkShader(prg); 
    return prg; 
}  

該代碼會產生錯誤

var prg1 = makeProgram(); 
var prg2 = makeProgram(); 
var u_someUniformLocation = gl.getUniformLocation(prg1, "u_someUniform"); 

gl.useProgram(prg2); 
gl.uniform3fv(u_someUniformLocation, [1,2,3]); // ERROR! 

u_someUniformLocationprg1prg2即使着色器程序,他們是獨立的程序和有需要單獨WebGLUniformLocation對象相同。

+0

是的。這有幫助! – ikis 2014-11-02 00:34:07