更改程序时是否设置了webgl制服属性?

时间:2016-02-19 16:01:52

标签: javascript webgl

每次切换程序或渲染时,是否必须设置制服/属性等?如下面的行?或者我可以在初始化时将它们设置一次吗?

        gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);
        //gl.enableVertexAttribArray(this.attrCell.a_texCoord);
        gl.vertexAttribPointer(this.attrCell.a_texCoord, 2, gl.FLOAT, false, 0, 0);
        gl.uniform2f(this.uniformCell.u_resolution, this.canvas.width, this.canvas.height);
        gl.bindBuffer(gl.ARRAY_BUFFER, this.posCoordBuffer);
        //gl.enableVertexAttribArray(this.attr.a_position);
        gl.vertexAttribPointer(this.attrCell.a_position, 2, gl.FLOAT, false, 0, 0);

        gl.activeTexture(gl.TEXTURE0 + 0);
        gl.bindTexture(gl.TEXTURE_2D, this.texture[0]);
        //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
        //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
        //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
        //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
        gl.uniform1i( this.uniformCell['u_image'], 0);

1 个答案:

答案 0 :(得分:1)

每个webgl上下文都有一组属性,每个着色器程序都有自己的一套制服。基本上,属性是所有着色器程序都可以访问的全局变量,每个着色器程序都有自己的统一变量实例。

例如,如果使用着色器#1设置属性,并且切换到着色器#2时,如果使用相同的属性,则无需再次重新设置属性。如果在着色器#1中设置制服,则当切换到着色器#2时,即使制服相同,也需要在着色器#2中设置制服。但是,如果您切换回着色器#1,并且您仍在使用先前使用相同的制服设置,则无需再次重新设置它,因为您已经第一次设置它。

另请注意,统一和属性位置均为每个着色器程序。例如,对于使用相同纹理的两个程序,纹理的统一位置可能不相同。属性位置相同。