OpenGL render-to-texture-via-FBO - visualización incorrecta vs. textura normal

el renderizado fuera de la pantalla a un objeto framebuffer fuera de pantalla vinculado a la textura debería ser tan trivial, pero tengo un problema que no puedo entender.

Mi programa de muestra completo (¡2D solo por ahora!) Está aquí:

http: //pastebin.com/hSvXzhJ

Vea a continuación algunas descripciones.

Estoy creando un objeto de textura rgba 512x512, unirlo a un FBO. No se necesitan profundidades u otros búferes de renderizado en este punto, estrictamente 2D.

Los siguientes sombreadores extremadamente simples representan 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 solo obtiene un VBO que contiene 4 coordenadas xy para un quad (-1, -1 :: 1, -1 :: 1, 1 :: -1, 1)

Así que, aunque la resolución del framebuffer debería ser teóricamente de 512x512, obviamente, el sombreador presenta su "textura" en un "quad de pantalla completa (apagado)", siguiendo el paradigma de las coordenadas GLs -1..1.

Shader de fragmento:

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

e modo que establece un color totalmente opaco con rojo fijado en 0.25 y verde / azul dependiendo de x / y en cualquier lugar entre 0 y 1.

n este punto, supongo que se renderiza una textura de 512x512 que muestra solo el cuadrante de pantalla -1..1 completo (apagado), sombreado con fragmentos para verde / azul de 0..1.

Así que esta es mi configuración fuera de pantalla. En pantalla, tengo otro quad visible real a pantalla completa con 4 coordenadas 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, por lo tanto, z siempre es 1.

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

This doRtt = false mode muestra que el segundo renderizador cuádruple en pantalla es "correcto" para mis requisitos actuales y realiza el texturizado como yo quiero: repetido dos veces verticalmente y dos veces horizontalmente (más tarde se sujetará, la repetición es solo para prueba aquí), de lo contrario escalar sin filtrado de textura o mipmapping.

or lo tanto, no importa cómo se cambie el tamaño de la ventana (y, por lo tanto, el puerto de visualización), 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 sigue haciendo su trabajo, pero la textura nunca se escala completamente o se dibuja, no estoy seguro, ya que desafortunadamente no podemos decir "hey gl, guarda este FBO en el disco para fines de depuración ".

El sombreador RTT REALIZA un renderizado parcial (o tal vez uno completo, de nuevo no puedo estar seguro de lo que está sucediendo fuera de la pantalla ...) Especialmente cuando cambia el tamaño de la ventana gráfica mucho más pequeña que el tamaño predeterminado, ve los intervalos entre se repite la textura, y no se muestran todos los colores que se esperan de nuestro sombreador de fragmentos RTT muy simple.

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

(B) o: la textura de 512x512 no se representa correctamente y de alguna manera el sombreador rtt frag cambia su salida dependiendo de la resolución de la ventana, pero ¿por qué? El quad fuera de la pantalla siempre está en -1..1 para x e y, el sombreador de vértices siempre asigna esto a fragmentos de fragmentos 0..1, ¡la textura RTT siempre permanece en 512x512 para esta prueba simple!

Nota, AMBOS el quad fuera de la pantalla Y el quad en la pantalla nunca cambian sus coordenadas y siempre están en "pantalla completa" (-1..1 en ambas dimensiones).

De nuevo, esto debería ser tan simple. ¿Qué demonios me estoy perdiendo?

Specs: 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.