Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es 如何在WebGL中存储和访问每片段属性_Opengl Es_Three.js_Webgl_Fragment Shader_Particle System - Fatal编程技术网

Opengl es 如何在WebGL中存储和访问每片段属性

Opengl es 如何在WebGL中存储和访问每片段属性,opengl-es,three.js,webgl,fragment-shader,particle-system,Opengl Es,Three.js,Webgl,Fragment Shader,Particle System,我正在使用Three.js在WebGL中创建一个粒子系统,我想在着色器中完成所有粒子的计算。为此,粒子的位置(例如)存储在纹理中,该纹理由每个粒子(点基本体)的顶点着色器进行采样 “位置”(position)纹理实际上是两个渲染目标,在屏幕外更新后,每个帧都会进行交换。此纹理的每个像素表示一个粒子。 为了更新位置,我读取其中一个渲染目标(texture2D),进行一些计算,然后在另一个渲染目标(片段输出)上写入 要执行“执行一些计算”步骤,我需要一些每粒子属性,比如它的速度(以及许多其他属性)。

我正在使用Three.js在WebGL中创建一个粒子系统,我想在着色器中完成所有粒子的计算。为此,粒子的位置(例如)存储在纹理中,该纹理由每个粒子(点基本体)的顶点着色器进行采样

“位置”(position)纹理实际上是两个渲染目标,在屏幕外更新后,每个帧都会进行交换。此纹理的每个像素表示一个粒子。 为了更新位置,我读取其中一个渲染目标(texture2D),进行一些计算,然后在另一个渲染目标(片段输出)上写入

要执行“执行一些计算”步骤,我需要一些每粒子属性,比如它的速度(以及许多其他属性)。因为这一步是在片段着色器中完成的,所以我不能使用顶点属性缓冲区,所以我必须将这些属性存储在单独的纹理中,并在片段着色器中对每个属性进行采样

这是可行的,但据我所知,纹理采样很慢,我想知道是否有更好的方法来实现这一点,比如每个粒子有一个顶点,每个顶点渲染一个位置纹理片段。
我知道OpenGL 4是处理这个问题的一些替代方法,比如UBO或SSBO,但我不确定WebGL。

我认为使用纹理是一种方法。使用2个RGBA纹理应该可以提供8个参数来处理。在生成片段时,位置已经被处理(剪裁、投影并映射到设备坐标)。因此,如果要改变位置,则必须在顶点着色器中进行。我不确定你所说的wcochran是什么意思。我的纹理系统已经很好地工作了,我还没有注意到你描述的问题。你能解释一下如何在顶点着色器中加载、更改和保存粒子的当前位置吗?你不能,你需要一个纹理。不过我有点困惑。按照我的理解,你将位置渲染到纹理,在粒子顶点着色器中读取,然后计算速度?不,要渲染位置,我需要读取存储在纹理中的速度属性(这是我通过这个问题试图改进的)。