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 为什么我的所有粒子共享相同的旋转和颜色?(GLSL着色器)_Opengl_Geometry_Shader_Particles - Fatal编程技术网

Opengl 为什么我的所有粒子共享相同的旋转和颜色?(GLSL着色器)

Opengl 为什么我的所有粒子共享相同的旋转和颜色?(GLSL着色器),opengl,geometry,shader,particles,Opengl,Geometry,Shader,Particles,正如标题所示,我正在OpenGL中构建一个粒子系统,使用几何体着色器从点创建广告牌。看起来一切正常,但看起来所有粒子都共享第一个粒子的旋转和颜色。当然,我已经检查了输入。 以下是我当前的顶点和几何体着色器: 顶点着色器: #version 330 core layout(location=0) in vec4 in_position; layout(location=2) in float in_angle; layout(location=3) in vec4 in_color; unif

正如标题所示,我正在OpenGL中构建一个粒子系统,使用几何体着色器从点创建广告牌。看起来一切正常,但看起来所有粒子都共享第一个粒子的旋转和颜色。当然,我已经检查了输入。 以下是我当前的顶点和几何体着色器:

顶点着色器:

#version 330 core

layout(location=0) in vec4 in_position;
layout(location=2) in float in_angle;
layout(location=3) in vec4 in_color;

uniform mat4 P;
uniform mat4 V;

out VertexData
{
    vec4 color;
    float angle;
} vertex;

void main()
{
    vertex.color = in_color;
    vertex.angle = in_angle;
    gl_Position = in_position;
}
几何体着色器:

#version 330

layout (points) in;
layout (triangle_strip, max_vertices = 4) out;

uniform mat4 V;
uniform mat4 P;

in VertexData
{
    vec4 color;
    float angle;
} vertex[];

out vec4 fragColor;
out vec2 texcoord;

mat4 rotationMatrix(vec3 axis, float angle)
{
    axis = normalize(axis);
    float s = sin(angle);
    float c = cos(angle);
    float oc = 1.0 - c;
    return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0,
    oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0,
    oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0,
    0.0, 0.0, 0.0, 1.0);
} // http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/

    void main()
{
    mat4 R = rotationMatrix( vec3(0,0,1), vertex[0].angle );
    vec4 pos = V * vec4( gl_in[0].gl_Position.xyz, 1.0 );
    float size = gl_in[0].gl_Position.w;

    texcoord = vec2( 0.0, 0.0);
    gl_Position = P * ( pos + vec4( texcoord, 0, 0 ) * R * size );
    fragColor = vertex[0].color;
    EmitVertex();

    texcoord = vec2( 1.0, 0.0);
    gl_Position = P * ( pos + vec4( texcoord, 0, 0 ) * R * size );
    fragColor = vertex[0].color;
    EmitVertex();

    texcoord = vec2( 0.0, 1.0);
    gl_Position = P * ( pos + vec4( texcoord, 0, 0 ) * R * size );
    fragColor = vertex[0].color;
    EmitVertex();

    texcoord = vec2( 1.0, 1.0);
    gl_Position = P * ( pos + vec4( texcoord, 0, 0 ) * R * size );
    fragColor = vertex[0].color;
    EmitVertex();

    EndPrimitive();
}

我在这里做错什么了吗?

啊,我找到了导致我的问题的原因。
我仍然有两次调用
glVertexAttributeDivisor()
,从我仍然使用
glDrawArraysInstanced()

时开始,当你说你已经检查了输入时,你是如何做到的?您是否尝试过在没有几何体着色器的情况下使用点基本体?这可能很简单,因为顶点缓冲区的步长/大小错误,导致每个额外顶点的结果未定义。我的意思是,我检查了传递给gpu的数组中的值。根据您的建议,我刚刚尝试取出几何体着色器并将其绘制为点基本体,但问题仍然存在。谢谢你的建议,我得研究一下缓冲。