在WebGL应用程序的顶点着色器程序中,我正在执行以下操作:
使用随时间变化的函数f(t)计算gl_Position P.
我的问题是:
是否可以存储在顶点着色器中计算的更新的P(t),以便我可以在下一个时间步中使用它?这对于执行一些边界测试很有用。
我已经阅读了一些关于纹理如何用于存储和更新vextex位置的信息,但这在WebGL中是否可行,因为在OpenGL ES 1.0中,甚至顶点程序的纹理访问都不受支持?
对于一个更具体的例子,让我们说我们试图根据等式R(t)=(k * t,0,0)来移动一个点。这些位置在顶点着色器中更新,这使得点移动。现在,如果我想让点在位于R =(C,0,0)的墙上反弹。要做到这一点,我们需要点在t - dt的位置。 (上一个时间步)。
任何想法都赞赏。
此致
答案 0 :(得分:1)
除了之前的答案,您可以绕过PBO的顶点纹理提取,但我不知道,如果它们在WebGL或GLES中受支持,因为我只有桌面GL体验。您将顶点位置写入帧缓冲区。但是,不是将它们用作顶点纹理,而是将它们复制到顶点缓冲区(通过PBO最好地工作)并将它们用作通常的顶点属性。这是做转换反馈的旧方法,我想这是不受支持的。
答案 1 :(得分:0)
你的dt
是不变的?如果是这样,您可以通过评估
R(t-dt)
。如果它不是常数,那么你可以使用uniform
在每个渲染周期中传递它。
答案 2 :(得分:0)
无法在顶点着色器中存储任何内容。您只能将值传递给片段着色器并将其写入帧缓冲区像素。正如你所说,顶点纹理提取并不是普遍支持的(例如,ANGLE几天前才开始支持它),所以即使这样也有点不可行。
你可以做两件事:要么在JS中进行所有位置数学运算,要么将p1和p0作为制服传递。或者跟踪前一个时间值并在着色器中进行两次位置数学运算,对于t1和t0(除非你是顶点着色器绑定,否则不应该对性能产生很大的影响)。