WebGL2设置uniform float时报No active linked Program错误求助
你遗漏的核心操作是:在修改uniform变量前,需要先将你编译链接完成的程序激活为WebGL上下文的当前使用程序。
WebGL是状态机模型,gl.uniform*系列方法只会修改当前处于激活状态的程序的uniform值,如果你没有指定激活的程序,就会抛出No active linked Program警告。
你只需要在获取uniform位置、赋值uniform之前,添加一行代码:
gl.useProgram(math_program);
完整的正确执行顺序如下:
// 1. 创建编译着色器(你代码中没贴这两步,确认你实际已经执行,否则链接会失败) gl.compileShader(vertex_shader); gl.compileShader(math_pass_shader); // 2. 附着、链接程序 var math_program = gl.createProgram(); gl.attachShader(math_program, vertex_shader); gl.attachShader(math_program, math_pass_shader); gl.linkProgram(math_program); // 3. 【你遗漏的步骤】激活当前要使用的程序 gl.useProgram(math_program); // 4. 获取uniform位置、赋值 var zoom = gl.getUniformLocation(math_program, "zoom"); var x = gl.getUniformLocation(math_program, "center_x"); var y = gl.getUniformLocation(math_program, "center_y"); gl.uniform1f(zoom, 2.5); gl.uniform1f(x, -0.5); gl.uniform1f(y, 0.0);
额外注意:如果你后续需要切换使用不同的着色器程序,每次切换前都需要重新调用gl.useProgram()指定新的激活程序。
内容的提问来源于stack exchange,提问作者bamia
相关产品推荐
相关产品推荐

