[英]WebGL2 how to draw feedback buffer to texture that is passed to shader uniform
如果我没有所有正确的术语,请提前致歉,我仍在学习并且需要时间让您了解 GPU 编码。
无论如何,我有一个变换反馈粒子程序在工作(请参阅循环代码的第一部分)和一个单独的程序,该程序使用 fbos 将着色器的 output 作为统一反馈给自身。
我一直在尝试做的是将变换反馈的渲染提供给第二个程序着色器的 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 uniform
这在 WebGL 中可能行不通(至少如果您真的想获取缓冲区并通过片段着色器中的采样器访问它,则行不通)。 在桌面 OpenGL 上,您可以访问缓冲区纹理,这将允许这种操作,但在 WebGL 上,缓冲区纹理不存在。
您可能会使用的一个解决方法是让第一个传递 output 数据到帧缓冲区 object(而不是写入转换反馈缓冲区)。 这将允许您将 FBO 的纹理作为输入绑定到第二遍片段着色器,然后在第二遍中使用纹理函数访问该数据。
texImage2D()
可以从PIXEL_UNPACK_BUFFER
目标读取数据。
我认为这意味着如果您可以将缓冲区与bindBuffer()
绑定为TRANSFORM_FEEDBACK_BUFFER
并进行变换反馈,那么您可以将其重新绑定为PIXEL_UNPACK_BUFFER
并使用texImage2D()
将内容上传到纹理? 我不知道命令的确切顺序,但似乎有可能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.