Unity / HLSL - 在第一遍中将顶点位置存储到渲染纹理中,以便在第二遍中进行正常计算

时间:2018-02-10 18:28:41

标签: unity3d shader unity5 hlsl

我试图使用GPU为表示水砖的大网格设置动画。

到目前为止,我设法更新"在飞行中"网格的顶点。我的意思是在飞行中,因为网格实际上没有更新,它保持平坦,只是它的顶点在渲染之前被修改,使用顶点着色器。

但是,我还需要重新计算法线以使其看起来更逼真。这样做需要我访问除当前顶点之外的其他顶点的位置。 4个相邻的顶点就足够了。但是,由于顶点着色器只能访问当前顶点,因此无法在一次传递中完成。

因此,我想在第一遍中修改顶点以模拟波浪,将这些更新的顶点存储在某处,并在第二条路径中重复使用它们以便更新法线。

我是否正确地考虑过这个问题?我昨天开始学习着色器,所以我是一个菜鸟。

我读了一些关于渲染到纹理的内容,这可以让我在第一遍和第二遍之间共享数据。这是正确的方法吗?如果是这样,我该怎么做?我没能找到关于此的代码示例。

如果重要的话,我试图在Unity 5.6.3上执行此操作。谢谢!

1 个答案:

答案 0 :(得分:0)

我的直觉是,如果位置是参数化的,为什么正常参数也是如此?你为什么需要相邻的顶点?您甚至可以在片段着色器中计算法线并具有更高的精度,就像法线贴图一样。

RenderTexture方法对我来说似乎并不好,相当复杂且效率不高(多次传递,需要在纹理中存储顶点数据,需要弄清楚邻接...)。

如果您仍想尝试这样的方法,我建议您查看在结构化缓冲区上运行计算着色器,然后让您的顶点着色器点击该缓冲区,以根据其索引获取顶点位置/法线。考虑到这一点,你甚至根本不需要网格,你可以使用DrawProceduralDrawProceduralIndirect来获得所需的顶点数。

这当然取决于您的目标API和硬件,但是现在计算着色器得到了广泛的支持(整个"在纹理中存储数据"方法更像是一个古老的黑客,尽管仍在使用中不幸的是)。