Unity 中的 HLSL 渲染到纹理/流输出

Zze*_*Zze 5 shader gpgpu hlsl unity-game-engine

我正在尝试在 Unity 5 中实现一个 HLSL 着色器,它会替换球体的顶点。

我想要解决的是如何有效地将信息从一帧传递到下一帧,以便我可以“保存”每个顶点的计算速度。

Nvidia 开发站点上,我发现了一篇有趣的文章,讨论了 GPU 流体动力学模拟。在那篇文章中,他们指出:

但是,在 GPU 上,片段处理器的输出始终写入帧缓冲区。将帧缓冲区视为无法直接读取的二维数组。有两种方法可以将帧缓冲区的内容放入可以读取的纹理中:

  • 复制到纹理 (CTT) 从帧缓冲区复制到纹理。
  • 渲染到纹理 (RTT) 使用纹理作为帧缓冲区,因此 GPU 可以直接写入它。

我记得在 Unity 中读过(来源丢失),这RenderTexture是一个 FBO,但经过数小时的搜索,我仍然不明白如何实现这一点(如果这甚至是实现这一目标的正确方法)。我目前的想法是我会创建 2 个通道,一个是根据现有速度计算新速度,然后第二个是操作网格。

我已经考虑过编写一个 GPGPU 着色器,但我非常希望在单个着色器中包含所有这些功能。

我在一个死胡同,有人可以指出我正确的方向。

澄清:

在一个Unity Compute Shader我可以渲染/输出任何我想要渲染纹理的东西:

渲染纹理也可以从计算着色器写入,如果它们设置了“随机访问”标志(DX11 中的“无序访问视图”),请参阅 RenderTexture.enableRandomWrite。 http://docs.unity3d.com/Manual/ComputeShaders.html

另请注意:

DirectX10 引入了一个称为流输出的新功能,该功能对于实现粒子系统非常有用。OpenGL 在 3.0 版中采用了相同的功能,并将其命名为 Transform Feedback。http://ogldev.atspace.co.uk/www/tutorial28/tutorial28.html

我可以在普通着色器中执行此操作吗?Unity 5.1+ 中是否有流输出。有转换反馈选项吗?