Android 如何从opegles着色器读取变量?

Android 如何从opegles着色器读取变量?,android,opengl-es,opengl-es-2.0,fragment-shader,glsles,Android,Opengl Es,Opengl Es 2.0,Fragment Shader,Glsles,我正在为Android编写一个粒子过滤器应用程序。我想让GPU并行处理所有粒子 我在顶点着色器中有代码根据每个粒子或顶点的当前位置更新其位置,但我不知道如何将更新后的位置写回openGLES,甚至无法让着色器在下一次运行时处理相同顶点 属性变量具有适当的作用域,但在顶点着色器中是只读的 统一变量具有适当的作用域,但不能使用数组(因此很难为大量顶点实现统一)。同样,它们在顶点着色器中是只读的 不同的变量具有允许修改的范围,但它们仅对程序中的片段着色器可见。如果片段着色器可以将信息写入openGLE

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

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

属性变量具有适当的作用域,但在顶点着色器中是只读的

统一变量具有适当的作用域,但不能使用数组(因此很难为大量顶点实现统一)。同样,它们在顶点着色器中是只读的

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


片段着色器是否有更新任何变量的方法?{attribute、uniform、variable、default、other}或者可能不向显示器而是向内存写入缓冲区?

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

你不能给制服写信,因为这毫无意义。成百上千个着色器实例同时运行,每个实例使用相同的制服集

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

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


我应该指出,当这样做时,所有粒子位置、颜色等的计算。。。延迟到一个特殊的片段着色器过程。粒子顶点着色器基本上只相当于使用早期片段着色器过程的结果进行纹理查找(以确定顶点应使用的位置、颜色等)。如果你在谷歌上看的话,有一些与此相关的教程和技术演示。在任何情况下,这都是在嵌入式硬件上的GPU上100%实现这一点的唯一方法,因为您没有计算着色器或变换反馈。

OpenGL ES 3.0支持变换反馈,不幸的是,我还是回到了2.0。你的建议听起来可能有用,但是链接到一个例子会有所帮助。既然我知道要找什么,我就看看能找到什么。