【发布时间】:2017-12-29 08:45:14
【问题描述】:
我是 WebGL 的菜鸟,我正在尝试通过阅读本教程来了解 WebGL 纹理的工作原理:WebGL Image Processing Continued。
在同一系列教程中还有另一个example,它通过为输入纹理单元0和1显式设置uniforms来使用两个纹理:
// set which texture units to render with.
gl.uniform1i(u_image0Location, 0); // texture unit 0
gl.uniform1i(u_image1Location, 1); // texture unit 1
但在第一个示例中,片段着色器使用sampler2D u_image 作为输入纹理,所以我希望代码中应该有类似的内容:
gl.uniform1i(gl.getUniformLocation(program, "u_image"), 0);
...但我找不到它。 这是如何工作的?只是猜测:纹理单元 0 是否被用作所有 WebGL 程序中所有 2D 采样器的默认值?那么,为什么在第二个例子中需要gl.uniform1i(u_image0Location, 0);?
编辑:
到目前为止,我从上面提到的教程中了解到了什么——如果我错了,请纠正我:
至少有两种使用纹理的方法:
- 输入纹理,我可以从中读取 - 在这里,我需要将位置(即“u_image”)传递给片段着色器
- 输出纹理,我可以在其中写入 - 这是当前绑定的纹理(在上面提到的教程中,到纹理单元 0)
我无法完全理解此示例的工作原理,因为未设置 u_image 制服,而且代码中没有任何 gl.activeTexture() 调用
编辑 2:
感谢Rabbid76 我相信我在gman(上述教程的作者)in this answer 对question 的评论中找到了进一步的澄清:
您需要帧缓冲区。通过将纹理附加到帧缓冲区和 然后绑定那个你正在让着色器写入的帧缓冲区 纹理。
【问题讨论】:
-
@Rabbid76: THX,在引用的示例中,绘图目标纹理是通过使用:
gl.bindTexture(gl.TEXTURE_2D, textures[ii % 2]);绑定的,所以我猜当前纹理单元始终为 0 并且永远不会改变,我怀疑是如何输入纹理工作... -
@Rabbid76:编辑了我的问题
标签: webgl