-1
제목에서 알 수 있듯이 OpenGL에서 지오메트리 셰이더를 사용하여 점으로 광고판을 만드는 입자 시스템을 구축하고 있습니다. 모든 것이 괜찮은 것처럼 보이지만 모든 입자가 첫 번째 입자의 회전과 색상을 공유하는 것처럼 보입니다. 물론 입력을 확인했습니다.왜 모든 입자가 같은 회전과 색상을 공유합니까? (GLSL Shaders)
버텍스 쉐이더 :
#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();
}
내가 여기에 뭔가 잘못하고 있습니까 여기에 내 현재의 정점과 지오메트리 쉐이더입니까?
입력을 확인했다고 말하면 어떻게 했습니까? 기하학 쉐이더없이 포인트 프리미티브를 시도해 보셨습니까? 이것은 정점 버퍼의 잘못된 보폭/크기와 같은 간단한 것일 수 있습니다. 추가 정점마다 정의되지 않은 결과가 나타납니다. –
나는 내가 gpu에 전달하는 배열의 값을 검사했다. 귀하의 제안에 따라, 저는 기하 구조 셰이더를 꺼내어 포인트 프리미티브로 그려 보았습니다. 문제는 여전히 그대로입니다. 그 제안을 주셔서 감사합니다, 나는 버퍼링을 조사해야 할 것입니다. – shrekleton