Opengl 为什么粒子会朝着一个奇怪的方向运动
我想实现一个模拟降雨效果的粒子系统,粒子预计会沿-y方向移动,但只有部分粒子的行为正确,而其他粒子则会朝错误的方向移动-x。以下是计算着色器代码:Opengl 为什么粒子会朝着一个奇怪的方向运动,opengl,glsl,Opengl,Glsl,我想实现一个模拟降雨效果的粒子系统,粒子预计会沿-y方向移动,但只有部分粒子的行为正确,而其他粒子则会朝错误的方向移动-x。以下是计算着色器代码: #version 430 layout (local_size_x = 1000) in; struct Particle { vec4 pAnds; //position and size vec3 velocity;
#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上。如果它不起作用,如果您可以提供存储粒子的数据结构,这将有所帮助。此外,您还说渲染代码“已添加”。它在哪里?