WebGL2如何绘制反馈缓冲区的纹理,传递给着色器统一



如果我没有掌握所有正确的术语,请提前道歉,我仍在学习,并且需要时间来了解GPU编码。

无论如何,我有一个变换反馈粒子程序工作(见循环代码的第一部分)和一个单独的程序,使用fbos反馈着色器的输出作为一个统一到自己。

我一直在尝试做的是将转换反馈的渲染馈送到第二个程序着色器的sampler2d统一,但我无法解决如何将转换反馈缓冲区馈送到纹理中。任何想法吗?

loop = {
let t = 0;
while (true) {
gl.viewport(0, 0, canvas.width, canvas.height);

particleProg.use();

gl.uniform1f(particleProg.uniforms.uTick, t);
gl.bindBuffer(gl.ARRAY_BUFFER, buffers[t % 2]);
gl.vertexAttribPointer(particleProg.aPosLoc, 4, gl.FLOAT, gl.FALSE, 0, 0);
gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, buffers[(t + 1) % 2]);
gl.beginTransformFeedback(gl.POINTS);
gl.drawArrays(gl.POINTS, 0, size);
gl.endTransformFeedback();
// unbinds feedback buffer
gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);

/// transform feedback ^ ////////////// FBO v ////////////////////
postProg.use();
gl.activeTexture(gl.TEXTURE0 + fbos.first[2]);
gl.bindTexture(gl.TEXTURE_2D, fbos.first[0]);
gl.uniform1f(postProg.uniforms.uTick, t);
gl.uniform1i(postProg.uniforms.currState, fbos.first[2]);

blit(fbos.second[1]);
fbos.swap();

blit(null);
}
}

我一直在尝试做的是将转换反馈的渲染馈送到第二个程序着色器的sampler2d统一

这可能在WebGL中不起作用(至少如果你真的想要通过片段着色器中的采样器获取缓冲区并访问它)。在桌面OpenGL上,你可以访问缓冲纹理,这将允许这种操作,但在WebGL上,缓冲纹理不存在。

您可能使用的一种解决方法是让第一次传递也将数据输出到framebuffer对象(而不是写入转换反馈缓冲区)。这将允许你绑定FBO的纹理作为第二通道片段着色器的输入,然后在第二通道使用纹理函数访问该数据。

texImage2D()可以从PIXEL_UNPACK_BUFFER目标读取数据。

我认为这意味着,如果你可以绑定一个缓冲与bindBuffer()作为TRANSFORM_FEEDBACK_BUFFER和做转换反馈,然后你可以重新绑定它作为PIXEL_UNPACK_BUFFER和使用texImage2D()的内容上传到纹理?我不知道命令的确切顺序,但这似乎是可能的。

最新更新