有时候,在webgl中,使用gl.getUniformLocation()方法无法拿到值
比如下述代码:
shader代码
precision mediump float;
varying vec4 v_Color;
uniform vec4 u_FogColor;
void main(){
gl_FragColor = v_Color;
}
js代码
let u_FogColor = gl.getUniformLocation(gl.program, "u_FogColor");
console.log(u_FogColor);//这里输出的是null
猜测1:
shader中的u_FogColor没有被使用,所以js中拿不到
试验1:
u_FogColor赋值给一个color变量,但是color没有被其他对象使用
precision mediump float;
varying vec4 v_Color;
uniform vec4 u_FogColor;
void main(){
vec4 color = u_FogColor;//u_FogColor赋值给一个color变量,但是color没有被其他对象使用
gl_FragColor = v_Color;
}
结果1:
js中得到的还是null
猜测2:
shader中的u_FogColor必须被真正的使用
比如,最终被传递给gl_FragColor,或者被最终被传递给varying 等变量
试验2:
u_FogColor赋值给color变量后,color变量再赋值给gl_FragColor
precision mediump float;
varying vec4 v_Color;
uniform vec4 u_FogColor;
void main(){
vec4 color = u_FogColor;
gl_FragColor = color;
}
结果2:
js中成功获取!
最终结论:
shader中的uniform变量,只有在“最终真正被使用”后
才可以在js中拿到具体的值!