2014-10-30 43 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