繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM