Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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 为什么粒子会朝着一个奇怪的方向运动_Opengl_Glsl - Fatal编程技术网

Opengl 为什么粒子会朝着一个奇怪的方向运动

Opengl 为什么粒子会朝着一个奇怪的方向运动,opengl,glsl,Opengl,Glsl,我想实现一个模拟降雨效果的粒子系统,粒子预计会沿-y方向移动,但只有部分粒子的行为正确,而其他粒子则会朝错误的方向移动-x。以下是计算着色器代码: #version 430 layout (local_size_x = 1000) in; struct Particle { vec4 pAnds; //position and size vec3 velocity;

我想实现一个模拟降雨效果的粒子系统,粒子预计会沿-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

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

添加了渲染着色器代码。我用这个渲染着色器代码实现了另一个粒子系统,CPU计算粒子数据,而不是计算着色器,它工作得很好。我不确定是否有问题。那么,它现在工作了吗?您编辑代码时说问题出在限定符std430上。如果它不起作用,如果您可以提供存储粒子的数据结构,这将有所帮助。此外,您还说渲染代码“已添加”。它在哪里?