2012-03-27 17 views
9

De los pocos ejemplos que he visto en la red, gl_FragData [0] se supone que es un buffer de color. He intentado encontrar el significado de cada índice en gl_FragData y me encontré con este pasaje del libro de lenguaje de sombreado de OpenGL (Libro Naranja)¿Gl_FragData [0] siempre es un buffer de color?

gl_FragData es una matriz que se pueden asignar valores que se escriben en uno o más fuera de la pantalla tampones . El tamaño de esta matriz es dependiente de la implementación y se puede consultar con glGet con la constante simbólica GL_MAX_DRAW_BUFFERS. Los búferes fuera de la pantalla que son modificados como resultado de escribir valores en gl_FragData dentro de un sombreador de fragmentos se especifican con glDrawBuffers. El valor escrito en gl_FragData [0] actualiza el primer búfer de la lista especificada en la llamada a glDrawBuffers, el valor escrito en gl_FragData [1] actualiza el segundo búfer en la lista, y así sucesivamente.

No se especifica que el valor 0 de gl_FragData es siempre el búfer de color. Si hay tal especificación, ¿dónde puedo encontrarla? Si no, ¿cuál es una práctica normal al escribir en gl_FragData?

Respuesta

9

No tiene que ser un buffer de color per se. Pero si no es un buffer de color, entonces es nada.

La matriz de salida gl_FragData se refiere a los valores establecidos por glDrawBuffers. Y al usar un FBO, los valores que pasa a esta función solo pueden ser GL_COLOR_ATTACHMENTn o GL_NONE. Que, como dicen los nombres, son memorias intermedias de color.

Por lo tanto, es un búfer de color o es GL_NONE.

Para implementaciones GL ES que no ofrecen glDrawBuffers (es decir, que no implementan NV_draw_buffers), se define como si el índice cero se fijó a GL_COLOR_ATTACHMENT0.

Es tonto de ES 2.0 para permitir la posibilidad de múltiples archivos adjuntos sin tener que proporcionar una manera de hacer que a más de uno de ellos ...

+0

supongo glDrawBuffers no está disponible en OpenGL ES. En ese caso, el FBO lo llama implícitamente en algún momento? – Jayesh

+0

'glDrawBuffers' (no confunda con' glDrawBuffer', la elección de nombres muy inteligente ...) es parte de ARB_draw_buffers, que es el núcleo de OpenGL 2.0. Como OpenGL ES 2.0 se define en relación con OpenGL 2.0, debe incluir esa función. – Damon

+0

@Damon: Técnicamente, ['glDrawBuffer'] (http://www.opengl.org/wiki/GLAPI/glDrawBuffer) se define en términos de' glDrawBuffers'; es simplemente una forma más restrictiva (establece el índice 0 en el búfer de entrega y todos los demás en 'GL_NONE'). Pero tampoco lo está en GL ES 2.0. –

Cuestiones relacionadas