我的代码有效,但我想知道为什么!在绘制之前绑定纹理(webgl)
我有2个纹理:
uniform sampler2D uSampler0;
uniform sampler2D uSampler1;
void main() {
vec4 color0 = texture2D(uSampler0, vTexCoord);
vec4 color1 = texture2D(uSampler1, vTexCoord);
gl_FragColor = color0 * color1;
}
和我的js代码
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D,my_texture_ZERO);
gl.uniform1i(program.uSampler0,0);
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D,my_texture_ONE);
gl.uniform1i(program.uSampler1);
// uncomment one of the 3, it works.
// gl.bindTexture(gl.TEXTURE_2D, my_texture_ZERO);
// gl.bindTexture(gl.TEXTURE_2D, my_texture_ONE);
// gl.bindTexture(gl.TEXTURE_2D, texture_FOR_PURPOSE_ONLY);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
gl.draw之前,我已经测试了3个绑定, 每一件作品!
所以,我不明白真正的管道基础。
感谢一些解释
好的,但它不工作,如果我做一个:'gl.bindTexture(gl.TEXTURE_2D,null)',那么绑定之前画的立场? –
绑定代表在活动单元中设置纹理。您之前通过调用glActiveTexture(GL_TEXTURE0)激活了单位0; 。正如你所猜测的 - GL_TEXTURE0表示0单位。之后,您通过调用glBindTexture来绑定纹理。如果你用null(或0是明确的)调用glBindTexture,你将从单元中移除纹理。另外请记住,您可以切换活动单位,但通过切换活动单位,您不会丢弃先前活动单位中的更改,因此纹理将停留在那里。 – spectre
Okk ...并且如果在进行绑定之前没有显式活动单元,则默认情况下该绑定处理单元0。 –