2012-03-09 10 views
6

renderizado fuera de pantalla a un objeto framebuffer fuera de pantalla vinculado a texturas debería ser tan trivial pero estoy teniendo un problema No puedo entenderlo .OpenGL render-to-texture-via-FBO - visualización incorrecta frente a la textura normal

Mi programa muestra completa (! 2D sólo por ahora) está aquí:

http://pastebin.com/hSvXzhJT

Véase más abajo para algunas descripciones.

Estoy creando un objeto de textura rgba 512x512, conéctelo a un FBO. No se necesitan profundidades u otros almacenamientos intermedios de representación en este punto, estrictamente 2D.

Los siguientes shaders extremadamente simples rinden a esta textura:

Vertex Shader:

varying vec2 vPos; attribute vec2 aPos; 
void main (void) { 
    vPos = (aPos + 1)/2; 
    gl_Position = vec4(aPos, 0.0, 1.0); 
} 

En Apos esto sólo consigue un VBO que contiene 4 coordenadas XY para un quad (-1, -1 :: 1, -1 :: 1, 1 :: -1, 1)

Por lo tanto, aunque la resolución del framebuffer debería teóricamente por 512x512, obviamente el sombreador convierte su "textura" en un "cuadrante de pantalla completa" (off), siguiendo GLs -1..1 paradigma de coords.

Fragmento de sombreado:

varying vec2 vPos; 
void main (void) { 
    gl_FragColor = vec4(0.25, vPos, 1); 
} 

Por lo tanto, establece un color totalmente opaco con rojo fija en el 0,25 y verde/azul en función de x/y en cualquier lugar entre 0 y 1.

En este punto mi suposición es que se representa una textura de 512x512 que muestra solo el cuadrante de la pantalla completa -1.1 (apagado), con sombreado de fragmento para verde/azul de 0..1.

Así que esta es mi configuración fuera de pantalla. En la pantalla, tengo otro quad de pantalla completa real visible con 4 coords xyz {-1, -1, 1 ::: 1, -1, 1 ::: 1, 1, 1 ::: -1, 1, 1}. De nuevo, por ahora esto es 2D, por lo que no hay matrices, y z es siempre 1.

Este quad está dibujado por un sombreador diferente, simplemente presenta una textura determinada, estilo libro de texto GL-101. En mi programa de ejemplo vinculado anteriormente, tengo un booleano simple alternar doRtt, cuando esto es falso (el valor predeterminado), el renderizado a textura no se realiza en absoluto y este sombreador simplemente muestra uses texture.jpg del directorio actual.

Este modo doRtt = falso muestra que el segundo quad-renderer en pantalla es "correcto" para mis requisitos actuales y realiza las texturas como yo quiero: repetido dos veces verticalmente y dos veces horizontalmente (más tarde se pinzará, repetirá es solo para realizar pruebas aquí), de lo contrario escalar sin filtro de textura o mipmapping.

Así que no importa cómo se redimensiona la ventana (y por lo tanto ver el puerto), siempre vemos un quad de pantalla completa con una sola textura repetida dos veces horizontalmente, dos veces verticalmente.

Ahora, con doRtt = true, el segundo sombreador todavía hace su trabajo, pero la textura nunca está correctamente escalada - o dibujada, esto no estoy seguro ya que lamentablemente no podemos simplemente decir "hey gl save this" FBO en el disco para fines de depuración ".

El sombreador RTT REALIZA una representación parcial (o tal vez una completa, de nuevo no puede estar seguro de lo que está sucediendo fuera de la pantalla ...) Especialmente cuando cambias el tamaño de la ventana gráfica mucho más pequeña que el tamaño predeterminado, ves las pausas entre las repeticiones de textura, y no se muestran todos los colores que se esperarían de nuestro muy simple sombreador de fragmentos RTT.

(A) bien: la textura 512x512 se crea correctamente pero mi código no la correlaciona correctamente (pero entonces ¿por qué con doRtt = falso cualquier archivo texture.jpg dado usando el mismo simple texturizado quad-shader que muestra muy bien ?)

(B) o: la textura de 512x512 no se procesa correctamente y de alguna manera el sombreador rtt frag cambia su salida dependiendo de la resolución de la ventana, pero ¿por qué? El cuadrante fuera de la pantalla siempre está en -1..1 para xey, el sombreador de vértices siempre lo asocia al fragmento coords 0..1, ¡la textura RTT siempre se mantiene en 512x512 para esta simple prueba!

Nota, TANTO el quad fuera de pantalla Y el quad en pantalla nunca cambian sus coords y son siempre "a pantalla completa" (-1..1 en ambas dimensiones).

Una vez más, esto debería ser tan simple. ¿Qué demonios me estoy perdiendo?

Especificaciones: OpenGL 4.2 (¡pero el código no necesita ninguna característica 4.2 obviamente!), Nvidia Quadro 5010M, openSuse 12.1 64bit, Golang Weekly 22-Feb-2012.

+0

En caso de que Pastebin esté caído, el mismo archivo de origen también está aquí: http://dl.dropbox.com/u/2166329/testrtt.go - con un texture.jpg en la ruta, también. – metaleap

Respuesta

10

Antes que nada, intente comprobar los errores de OpenGL. Llame a glGetError() después de cada función de OpenGL. También debe establecer la ventana gráfica correcta para el dibujo. Antes de dibujar en FBO llame glViewport (0, 0, 512, 512). Antes de dibujar en la pantalla, llame a glViewport (0, 0, display_width, display_height).

Además, no es necesario enlazar rttFrameTex cuando se está renderizando con FBO. La textura de encuadernación solo se necesita cuando estás leyendo textura en shader.

+0

¡Y eso es todo lo que se necesitaba! Sorprendente, gracias por tomarse un tiempo para ayudarme con este - "Experimenté con el puerto de visualización" antes sin éxito, pero ahora funcionó al instante, ¡gracias de nuevo! ¿Alguien con> = 15 reputación upvote Mārtiņš? – metaleap

+0

@PhilS. ... En su lugar, voté en su favor. –