gl.getUniformLocation无法拿到值

有时候,在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中拿到具体的值!

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这段代码是用于开启 WebGL 中的混合功能,并设置混合函数。具体解释如下: - `gl.enable(gl.BLEND)`:启用混合功能。WebGL 可以将新绘制的像素颜色与画布上已经存在的像素颜色进行混合,从而实现透明度效果。 - `gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)`:设置混合函数。这行代码中,第一个参数 `gl.SRC_ALPHA` 表示使用源像素的 alpha (即透明度)作为混合因子,第二个参数 `gl.ONE_MINUS_SRC_ALPHA` 表示使用目标像素的 alpha 的补数作为混合因子。这个混合函数可以实现一种常见的混合效果,即源像素的 alpha 越大,混合结果中该像素的颜色就会占据更大的比例。 具体使用方法可以参考以下示例代码: ```javascript // 创建 WebGL 上下文 const canvas = document.getElementById('myCanvas'); const gl = canvas.getContext('webgl'); // 启用混合功能并设置混合函数 gl.enable(gl.BLEND); gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); // 绘制半透明矩形 gl.clearColor(0.0, 0.0, 0.0, 0.0); // 设置清空颜色为全透明 gl.clear(gl.COLOR_BUFFER_BIT); // 清空画布 gl.begin(gl.TRIANGLES); // 开始绘制三角形 gl.color4f(1.0, 0.0, 0.0, 0.5); // 设置颜色为半透明红色 gl.vertex3f(-1.0, -1.0, 0.0); gl.color4f(0.0, 1.0, 0.0, 0.5); // 设置颜色为半透明绿色 gl.vertex3f(1.0, -1.0, 0.0); gl.color4f(0.0, 0.0, 1.0, 0.5); // 设置颜色为半透明蓝色 gl.vertex3f(0.0, 1.0, 0.0); gl.end(); // 结束绘制 ``` 这段代码会绘制一个半透明的三角形,其中三个顶点的颜色分别为半透明的红色、绿色和蓝色。由于开启了混合功能并设置了混合函数,所以这个三角形看起来是半透明的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈地图

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值