为什么粒子向奇怪的方向移动

时间:2015-04-08 15:27:38

标签: opengl glsl

我想实现一个模拟下雨效果的粒子系统,粒子预计会沿着-y方向移动,但只有一些粒子系统表现正确,而其他粒子系统则向错误的方向移动-x。这是计算着色器代码:

#version 430
layout (local_size_x = 1000) in;

struct Particle
{
        vec4 pAnds;                                             //position and size
        vec3 velocity;
        float lifespan;
        float age;
};

layout (std430, binding = 0) buffer members_in
{
        Particle particle[];
} input_data;

shared int shared_newParticles = 480 / 60;

void main()
{
        int id = int(gl_GlobalInvocationID.x);

        float timestep = 1.0 / 60.0;

        if (input_data.particle[id].lifespan > 0)
        {
                input_data.particle[id].age += timestep;

                if (input_data.particle[id].age > input_data.particle[id].lifespan)
                {
                input_data.particle[id].lifespan = 0;
                }
                else
                {
                input_data.particle[id].pAnds.y += -0.1;
                }
        }
        else if (input_data.particle[id].lifespan == 0)
        {
                if (shared_newParticles > 0)
                {
                input_data.particle[id].pAnds = vec4(input_data.particle[id].pAnds.x, 20,
                input_data.particle[id].pAnds.z, input_data.particle[id].pAnds.w);
                input_data.particle[id].lifespan = 1.0;
                input_data.particle[id].age = 0.0;

                shared_newParticles--;
                }
        }
}

问题是由限定符引起的:std430

1 个答案:

答案 0 :(得分:1)

代码本身看起来不错,但由于你没有发布渲染粒子的着色器,因此很难诊断问题。我的假设是问题出在你的" hack"将位置和大小存储在单个变量中。如果您只是将此位置与顶点着色器中的模型 - 视图 - 投影 - 矩阵相乘,结果将非常奇怪。特别是矢量的w坐标会产生问题,因为存储在vec4中的位置必须在该位置具有1(它们是所谓的齐次坐标)。对于法线,您需要一个0.此坐标确定位置是否以及如何转换,因此它适合您的问题。如果您可以将应用的转换发布到粒子,也会有所帮助。