Three.js 顶点着色器中的OpenGL ES(GLSL ES)全局变量

Three.js 顶点着色器中的OpenGL ES(GLSL ES)全局变量,three.js,glsl,glsles,Three.js,Glsl,Glsles,也许这是一个微不足道的问题,但我并没有在网上找到任何东西。 我试图建立一个粒子系统模型,其中每个粒子都遵循牛顿引力定律。我必须估计每个粒子的轨迹,考虑到运动是均匀加速的,间隔很小。 我的问题是,是否可能有全局变量(一个vec3表示当前位置,一个vec3表示当前速度),这样我可以做如下操作: vec3 p; vec3 velocity; void main(){ float delta_t = 0.1; if(//is the first time){ //Calc

也许这是一个微不足道的问题,但我并没有在网上找到任何东西。 我试图建立一个粒子系统模型,其中每个粒子都遵循牛顿引力定律。我必须估计每个粒子的轨迹,考虑到运动是均匀加速的,间隔很小。 我的问题是,是否可能有全局变量(一个vec3表示当前位置,一个vec3表示当前速度),这样我可以做如下操作:

vec3 p;
vec3 velocity;
void main(){
    float delta_t = 0.1;
    if(//is the first time){
        //Calculate initial parameters
        p = position;
        velocity = vec3(//initial velocity computed);
    }
    vec3 a = //compute actual acceleration vector as -(GM/p^2)*vers(p)
    velocity = velocity + a*delta_t;
    p = p+velocity*delta_t+0.5*a*delta_t*delta_t;
    gl_Position = projectionMatrix * modelViewMatrix * vec4(p, 1.0);

}

如果我不能这样做,我该如何解决这个问题呢?

这个全局变量不会做你期望它做的事情。它不会在不同着色器调用之间保留状态

如果希望完全在GPU上进行渲染,则需要使用渲染目标,或者将其存储在一个属性中,手动更新该属性,并在每帧上载到GPU(不要这样做)

渲染目标应该执行
velocity=velocity+a*delta


您可能还需要“翻转”两个纹理(交替读/写),以便既可以读也可以写
velocity
。一旦你有了这个纹理,你就可以在这个着色器中访问它,所以你不用计算速度,而是计算纹理的索引
texture2D(velocitySampler,myIndex)

您应该阅读以下内容:。很抱歉,@zero298可能重复,但这是我第一次使用GLSL。我相信GLSL中不存在全局变量,我不需要统一变量,因为我必须在顶点着色器中修改它们。有没有办法做到这一点,或者仅仅因为我做错了,我就必须重新创造一切?你想实现什么?是否希望在着色器调用之间保持速度?如果是这样,则不能将其随机存储在着色器中,而是使用渲染目标。您将渲染
velocity+a*delta\t在一个单独的过程中分割,将结果写入纹理并在该着色器中查找。@pailhead是的,你是对的。我需要保持速度。我会听从你的建议,谢谢。