1

我正在为 Android 编写一个粒子过滤器应用程序。我希望 GPU 并行处理所有粒子。

我在顶点着色器中有代码可以根据当前位置更新每个粒子或顶点的位置,但我不知道如何将更新后的位置写回openGLES,甚至不知道如何将其提供给着色器处理下一次运行相同的顶点。

属性变量具有适当的范围,但只能在顶点着色器中读取。

统一变量有适当的范围,但你不能做数组(所以很难为大量顶点实现统一)。同样,它们只能在顶点着色器中读取。

可变变量具有允许修改的范围,但它们仅对程序中的片段着色器可见。如果片段着色器可以将信息写入openGLES,这可能会起作用。片段着色器可以修改属性变量(用于下一次运行)吗?

片段着色器有没有办法更新任何变量?{属性,统一,变化,默认,其他}或者可能写出一个缓冲区而不是显示器而不是内存?

4

1 回答 1

3

您正在以完全错误的方式考虑着色器。它们接受输入(例如在属性、制服、采样纹理中)进行一些计算,然后将它们输出到渲染管道的下一阶段。

你不能给制服写信,因为它没有任何意义。成百上千个着色器实例同时运行,每个实例都使用同一套制服。

也就是说,如果您使用 FBO,您可以做的是写入纹理附件。如果您明智地执行此操作,则可以在顶点着色器中查找此纹理中的值以确定粒子的新位置。您必须想出一个方案来解决哪个纹理对应于哪个粒子,如何将属性打包到 3 或 4 通道纹理中,等等。但这就是基于 GPU 的粒子系统通常是如何在预计算着色器中实现的。

或者,您可以使用转换反馈。但我不确定 OpenGL ES 是否支持这个?

我应该指出,当这样做时,粒子位置、颜色等的所有计算都被推迟到一个特殊的片段着色器通道。您的粒子顶点着色器基本上相当于使用早期片段着色器通道的结果进行纹理查找(为了确定顶点应该使用的位置、颜色等)。如果您在 Google 上查看,则有与此相关的教程和技术演示。无论如何,这确实是您能够在嵌入式硬件上的 GPU 上 100% 执行此操作的唯一方法,因为您没有计算着色器或变换反馈。

于 2013-08-21T21:53:01.820 回答