2011-06-01 17 views
12

He estado escribiendo programas usando OpenGL. Recientemente, comencé a aprender OpenGL Shading Language. Soy un novato; así que por favor sean detallados en sus respuestas.Lenguaje de sombreado de OpenGL Diferentes tipos de variables (Calificadores)

Mis preguntas son:

  1. ¿Cuáles son los diferentes tipos de variables (calificadores) en GLSL?
  2. ¿Para qué se usan?
  3. ¿En qué se diferencian entre sí?

Estoy familiarizado con la variable "variable" que se pasa de los sombreadores de vértices a los sombreadores de fragmentos para interpolar entre los vértices. Aparte de eso, no sé nada más.

+1

Gracias a todos por sus respuestas. De algunas fuentes en línea, encontré información sobre dos calificadores "dentro" y "fuera", que también se pueden usar para la comunicación Vertex - Fragment Shaders. Son muy similares al calificador "variable". ¿Son una "clase" de calificadores por separado o solo una alternativa al calificador "variable"? – Einiosaurus

Respuesta

21

En OpenGL 3+:

  • varying es obsoleto
  • const es para ... bueno, constantes!
  • uniform es para por llamada sorteo (como máximo) Valores
  • in es para la entrada de la etapa de canalización anterior, de vértices valores es decir, por (o por fragmento) a lo sumo, por primitiva si se utiliza glAttribDivisor y hardware instanciation
  • out es para la salida a la siguiente etapa

cuanto a salidas para shaders fragmento: en OpenGL3 y arriba, la mayor parte de la incorporada en las variables para la salida de fragmento shader (como gl_FragColor, con la notable excepción de gl_FragDepth) están en desuso y debe ser reemplazado con variables definidas por el usuario out.

Si está enviando al framebuffer predeterminado, lo que declare como la salida del shader de fragmentos termina en el búfer de color. Si ha vinculado un FBO con varios búferes de color (es decir, varios destinos de procesamiento), deberá vincular manualmente cada una de las variables out al índice de búfer de color correcto a través del glBindFragDataLocationIndexed.

Todos los detalles que usted podría desear tanto sobre el lado GLSL ('server') y el OpenGL ('cliente') lateral se puede encontrar:

+0

Genial, muchas gracias! Solo una pequeña pregunta, ¿cuál es la próxima etapa de un Fragment Shader? Si su Fragment Shader define una variable "out", ¿a dónde se pasa el valor de esa variable? – Einiosaurus

+0

¡Edité mi respuesta para aclarar el problema de la salida del sombreador de fragmentos! –

+0

"¿Cuál es la próxima etapa de un Fragment Shader?" -> ninguno en 2011, pero todos esperan "sombreadores de mezcla" en lugar de feo glBlendFunc. EDITAR: +1 para cotizar especificaciones con páginas exactas. – Calvin1602

3
  • Uniforme: datos constantes por llamada de dibujo, generalmente utilizados para parametrizar sombreadores.
  • Variando: Transfiere datos entre el VS y el FS, interpolando a lo largo de la primitiva en el proceso.
  • Atributo: Este es el atributo de datos de vértices, la entrada del Vertex Shader. Se especifica para cada vértice en la primitiva.
Cuestiones relacionadas