2014-08-27 3 views
-1

Как и название, я создаю систему частиц в OpenGL, используя геометрический шейдер для создания рекламных щитов из точек. Все выглядит нормально, но похоже, что все частицы разделяют вращение и цвет первой частицы. Конечно, я проверил входные данные. Вот мои текущие вершинные и геометрические шейдеры:Почему все мои частицы имеют одинаковый поворот и цвет? (GLSL Shaders)

Vertex Shader:

#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(); 
} 

Я делаю что-то неправильно здесь?

+0

Когда вы говорите, что вы проверили ввод, как вы это сделали? Вы пытались попробовать примитивы точки без геометрического шейдера? Это может быть что-то столь же простое, как неправильный шаг/размер вашего вершинного буфера, приводящий к неопределенным результатам для каждой дополнительной вершины. –

+0

Я имел в виду, что я проверил значения в массивах, которые я передал в gpu. По вашему предложению я только что попытался вытащить геометрический шейдер и нарисовать их как примитивы точек, то же самое проблема все еще существует. Спасибо за это предложение, мне придется заглянуть в буферизацию. – shrekleton

ответ

0

Ahh Я узнал, что вызвало мою проблему. У меня все еще было два звонка до glVertexAttribDivisor(), с тех пор, как я все еще использовал glDrawArraysInstanced().