2012-09-11 1 views
1

Je dois rendre une scène OpenGL à une texture afin de manipuler ensuite cette texture dans un shader. J'ai résolu ceci en utilisant des objets de Framebuffer, que je pense que je comprends assez bien maintenant. À de nombreux points dans mon pipeline d'effets, j'ai besoin de rendre un quad fullscreen et de le texturer avec la texture rendue dynamiquement, ce qui est mon problème.Rendu à une texture, puis rendu résultat à l'écran dans OpenGL

C'est ce que ma scène ressemble à: https://www.mathematik.uni-marburg.de/~thomak/planet.jpg

Je rends ce à une texture et carte que la texture à un quad en plein écran. Cependant, l'image résultante est déformée de cette façon: https://www.mathematik.uni-marburg.de/~thomak/planettexture.jpg

Voici le code qui rend les coordonnées quad et définit la texture:

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glBegin(GL_QUADS); 

glTexCoord2i(0, 0); 
glVertex3i(-1, -1, -1);  
glTexCoord2i(0, 1); 
glVertex3i(1, -1, -1); 
glTexCoord2i(1, 1); 
glVertex3i(1, 1, -1); 
glTexCoord2i(1, 0); 
glVertex3i(-1, 1, -1); 

glEnd(); 
glPopMatrix(); 
glMatrixMode(GL_MODELVIEW); 
glPopMatrix(); 

Et le code shader est ici:

sampler2D BlitSamp = sampler_state 
{ 
    MinFilter = LINEAR; 
    MagFilter = LINEAR; 
    MipFilter = LINEAR; 
    AddressU = Clamp; 
    AddressV = Clamp; 
}; 

float4 AlphaClearPS(float2 texcoords : TEXCOORD0) : COLOR 
{ 
    return float4(tex2D(BlitSamp, texcoords).rgb, 1.0f); 
} 

Où BlitSamp est la texture que j'ai rendue puis transmise au shader. Que pourrait-il se passer ici?

Répondre

2

Il est possible que vos tex-coords soient désactivés. Votre code, mes commentaires:

glTexCoord2i(0, 0);  //Bottom-Left 
glVertex3i(-1, -1, -1); //Bottom-Left  

glTexCoord2i(0, 1);  //Top-Left 
glVertex3i(1, -1, -1); //Bottom-Right??? 

glTexCoord2i(1, 1);  //Top-Right 
glVertex3i(1, 1, -1); //Top-Right 

glTexCoord2i(1, 0);  //Bottom-Right 
glVertex3i(-1, 1, -1); //Bottom-Left?? 
+0

Merci, vous êtes sur! Je transfère essentiellement une application Direct3D à OpenGL et je ne savais pas qu'ils étaient en désaccord sur l'origine de l'espace UV ... Je sais que c'est en haut à gauche dans Direct3D, est-ce qu'il est en bas à gauche dans OpenGL? – Campusanis

+0

Ils sont généralement en bas à gauche dans OpenGL, oui. Heureux de vous aider! – bfishman

1

Votre code pour rendre le quad semble bien, ce qui indiquerait une différence dans la taille du quad et la taille de la fenêtre.

Pourriez-vous avoir échangé la largeur et la hauteur lorsque vous avez créé la texture de rendu, par hasard?