如何在 WebGL 中为输出纹理或帧缓冲区提供偏移量?

How do I provide offsets for the output texture or framebuffer in WebGL?

如果我想在我的输入纹理中使用某个区域而不是整个区域,我可以使用 gl.texSubImage2D() 并提供 xy 偏移量。

输出纹理中的等效项是什么?鉴于在我的片段着色器中我无法控制我正在写入的纹素。 调用 gl.viewPort() 会成功吗?我需要为此更改 canvas 尺寸吗?

作为@J。 van Langen 指出你 gl.scissor 会起作用。您需要使用 gl.enable(gl.SCISSOR_TEST) 启用剪刀测试,然后使用 gl.scissor(x, y, width, height)

设置要裁剪的矩形

示例:

const gl = document.querySelector("canvas").getContext("webgl");
gl.enable(gl.SCISSOR_TEST);
gl.scissor(50, 25, 150, 75);
gl.clearColor(1, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);  // notice the entire canvas is not cleared
canvas { border: 1px solid black; }
<canvas></canvas>

那么这又取决于你对"offset"的定义。剪刀矩形只是剪裁,不会偏移(通常是平移)。正如你提到的,你可以使用 gl.viewport 来抵消。 gl.viewport 不影响 gl.clear。它只影响分配给 gl_Position 的顶点如何转换回屏幕坐标以及这些顶点如何被剪裁。

重要的是要注意它剪切的是顶点,而不是像素,因此在视口边缘绘制的 10 像素点(如 gl_PointSize = 10.0)将部分绘制在视口之外。因此,通常如果您将视口设置为小于您正在绘制的任何内容的完整大小,您是否也会启用并设置剪刀矩形。