2012-01-09 24 views
6

Estoy tratando de escribir un sombreador de geometría simple que simplemente pasa a través de vértices antes de intentar modificar cosas.GLSL 1.5 Sombreador de geometría simple

Mi vertex shader es

#version 150 core 
in vec3 inPosition; 
in vec4 inColor; 

out vec4 vertexColor; 

void main() { 
    vertexColor = inColor; 
    gl_Position = vec4(inPosition, 1.0); 
} 

Mi shader de geometría es

#version 150 core 
layout (triangles) in; 
layout (triangle_strip, max_vertices=3) out; 

void main() { 
    gl_Position = gl_in[0].gl_Position; 
    EmitVertex(); 

    gl_Position = gl_in[1].gl_Position; 
    EmitVertex(); 

    gl_Position = gl_in[2].gl_Position; 
    EmitVertex(); 
    EndPrimitive(); 
} 

Y mi fragmento shader es

#version 150 core 
in vec4 vertexColor; 
out vec4 fragColor; 

void main() { 
    fragColor = vertexColor; 
} 

Sin el shader de geometría vinculado en, todo funciona bien. Sin embargo, cuando hago un enlace en el sombreador de geometría, deja de funcionar. ¿Qué es lo que me estoy perdiendo? ¿Mi sombreador Geometry requiere una entrada para el vertexColor de mi sombreador de vértices y, de ser así, cómo se hace?

+0

http://en.wikipedia.org/wiki/GLSL#A_sample_trivial_GLSL_geometry_shader? – n0rd

+0

Eso no responde mi pregunta. Mi shader de geometría es exactamente el mismo que el que figura en esa página, con la excepción del bucle for eliminado. Sin embargo, no funciona. Nada se dibuja. También los sombreadores de vértices y fragmentos que se muestran en esa página son para glsl 1.20 Existe un problema al vincular todos estos elementos que no entiendo y no puedo encontrar información sobre cómo solucionarlo. – user1139069

Respuesta

7

Mi shader de geometría es exactamente la misma que la que aparece en esa página

Sí, pero sus vértices y sombreadores de fragmentos gratuitos son no.

La información fluye a través de la tubería OpenGL de la siguiente manera: Primero, el sombreador de vértices obtiene cosas. Pasa sus salidas al sombreador de geometría, si está presente. El sombreador de geometría pasa sus salidas al sombreador de fragmentos (después de la rasterización de triángulos habitual, por supuesto). Y el sombreador de fragmentos pasa sus salidas a la etapa de mezcla.

Su vertex shader tiene dos salidas: gl_Position y vertexColor. Sin embargo, su sombreador de geometría solo toma una entrada: gl_in[0].gl_Position. Esto no es legal en GLSL: si una etapa emite un valor, ingrese la siguiente etapa . Las únicas excepciones son para valores definidos por GLSL como gl_Position, que consume el rasterizador.

Su GS de paso necesita realmente pasar los datos a través de si quiere que sea de paso. Debe tomar la entrada adecuada en su GS:

in vec4 vertexColor[]; 

Sin embargo, las variables globales en GLSL no se pueden nombrar de la misma manera. Por lo tanto, no puede tomar vertexColor como entrada y como salida. Así que en lugar, usted tiene que cambiar el nombre de la salida (o utilizar interface blocks):

out vec4 gsColor; 

Su fragment shader debe ahora tomar in vec4 gsColor; y trabajar con eso.

Cuando intentó vincular estos sombreadores, su compilador debería haberle proporcionado un registro de información apropiado para explicar la discrepancia. ¿Estás recibiendo tus registros de información cuando tus sombreadores no pueden enlazar? Si no, deberías.

+0

¿Es necesario que gsColor sea una matriz y si estuviera fuera de vértices agregados, ¿cómo coincidiría la salida de gsColor con los vértices agregados? Si gsColor debería ser una matriz como supongo que debería ser, ¿los índices de esa matriz coincidirían con el orden de los vértices que estoy emitiendo? – user1139069

+0

'gl_Position' en el sombreador de geometría tampoco es una matriz. Usted escribe cada salida, luego llama a 'EmitVertex' para producir todas esas salidas. Establece 'gsColor' para cada vértice que emita, al igual que establece' gl_Position' para cada vértice emitido. –

+0

Algo así como 'gl_Position = gl_in [0] .gl_Position; gsColor = vertexColor [0] EmitVertex(); gl_Position = gl_in [1] .gl_Position; gsColor = vertexColor [1] EmitVertex(); '? – user1139069

Cuestiones relacionadas