每次切换程序或渲染时,是否必须设置制服/属性等?如下面的行?或者我可以在初始化时将它们设置一次吗?
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);
答案 0 :(得分:1)
每个webgl上下文都有一组属性,每个着色器程序都有自己的一套制服。基本上,属性是所有着色器程序都可以访问的全局变量,每个着色器程序都有自己的统一变量实例。
例如,如果使用着色器#1设置属性,并且切换到着色器#2时,如果使用相同的属性,则无需再次重新设置属性。如果在着色器#1中设置制服,则当切换到着色器#2时,即使制服相同,也需要在着色器#2中设置制服。但是,如果您切换回着色器#1,并且您仍在使用先前使用相同的制服设置,则无需再次重新设置它,因为您已经第一次设置它。
另请注意,统一和属性位置均为每个着色器程序。例如,对于使用相同纹理的两个程序,纹理的统一位置可能不相同。属性位置相同。