我正在尝试使用GPU为表示水砖的大网格设置动画。
到目前为止,我设法更新了“在线”网格的顶点。我的意思是在飞行中,因为网格实际上没有更新,它保持平坦,它只是在渲染之前使用顶点着色器进行修改的顶点。
但是,我还需要重新计算法线以使其看起来更逼真。这样做需要我访问除当前顶点之外的其他顶点的位置。 4个相邻的顶点就足够了。但是,由于顶点着色器只能访问当前顶点,因此无法在单次传递中完成此操作。
因此,我想在第一遍中修改顶点以模拟波浪,将这些更新的顶点存储在某处,并在第二条路径中重复使用它们以便更新法线。
我正确地考虑了这个吗?我昨天刚开始学习着色器,所以我是个菜鸟。
我读了一些关于渲染到纹理的东西,这可以让我在第一遍和第二遍之间共享数据。这是正确的方法吗?如果是这样,我该怎么做?我没能找到关于此的代码示例。
我想在Unity 5.6.3上做这件事,如果重要的话。谢谢 !
我的直觉是,如果位置是参数化的,为什么法线也不能参数化呢?你为什么需要相邻的顶点?您甚至可以在片段着色器中计算法线并具有更高的精度,就像法线贴图一样。
RenderTexture方法对我来说似乎不太好,相当复杂且效率不高(多次传递,需要在纹理中存储顶点数据,需要弄清楚邻接...)。
如果您仍想尝试这样的方法,我建议您查看在结构化缓冲区上运行计算着色器,然后让您的顶点着色器点击该缓冲区,以根据其索引获取顶点位置/法线。考虑到这一点,你甚至根本不需要网格,你可以使用DrawProcedural或DrawProceduralIndirect和所需的顶点数。
这当然取决于您的目标API和硬件,但是现在计算着色器得到了广泛支持(整个“纹理中存储数据”方法更像是一个古老的黑客,虽然仍然在使用中)。