Glsl 从顶点着色器更新信息

Glsl 从顶点着色器更新信息,glsl,webgl,Glsl,Webgl,在WebGL应用程序的顶点着色器程序中,我执行以下操作: 使用随时间变化的函数f(t)计算gl_位置p 我的问题是: 是否可以将更新后的p(t)存储在顶点着色器中,以便在下一个时间步骤中使用?这将有助于执行一些边界测试 我已经阅读了一些关于如何使用纹理存储和更新vextex位置的信息,但这在WebGL中可行吗,因为OpenGL ES 1.0中甚至不支持从顶点程序访问纹理 对于一个更具体的例子,让我们假设我们正试图根据方程R(t)=(k*t,0,0)移动一个点。这些位置在顶点着色器中更新,从而使点

在WebGL应用程序的顶点着色器程序中,我执行以下操作:

使用随时间变化的函数f(t)计算gl_位置p

我的问题是:

是否可以将更新后的p(t)存储在顶点着色器中,以便在下一个时间步骤中使用?这将有助于执行一些边界测试

我已经阅读了一些关于如何使用纹理存储和更新vextex位置的信息,但这在WebGL中可行吗,因为OpenGL ES 1.0中甚至不支持从顶点程序访问纹理

对于一个更具体的例子,让我们假设我们正试图根据方程R(t)=(k*t,0,0)移动一个点。这些位置在顶点着色器中更新,从而使点移动。现在,如果我想让点在R=(C,0,0)处的墙上反弹。为此,我们需要点在t-dt的位置。(上一时间步)

任何想法都值得赞赏


你的
dt
是常数吗?如果是这样,您可以通过计算


R(t-dt)
。如果它不是一个常数,则可以使用
统一
在每个渲染周期中传递它。

无法在顶点着色器中存储任何内容。您只能将值从它传递到片段着色器并将其写入帧缓冲区像素。正如您所说,顶点纹理提取并不是普遍支持的(例如,ANGLE几天前才开始支持它),所以即使这样也有点不可行


你可以做两件事:要么用JS做所有的位置数学,然后把p1和p0作为制服传递。或者跟踪上一个时间值,并在着色器中进行两次位置数学运算,包括t1和t0(除非您绑定了顶点着色器,否则不会对性能产生太大影响)。

除了前面的答案之外,您还可以通过PBOs绕过顶点纹理提取,但我不知道WebGL或GLES是否支持它们,因为我只有桌面GL的经验。将顶点位置写入帧缓冲区。但是,不使用这些作为顶点纹理,而是将它们复制到顶点缓冲区(通过PBOs效果最好)中,并将它们用作常用的顶点属性。这是执行变换反馈的旧方法,我认为不支持这种方法。

不,这并不能解决需要上一个位置的问题,如我描述的弹跳点示例。例如,可能有许多这样的运动约束,我认为检查所有这些碰撞的唯一实用方法是访问以前的位置/速度值。。。