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