[OpenGL] Offscreen texture rendering to bitmap

Le côté programmation du développement d'un jeu vidéo.

Offscreen texture rendering to bitmap

Messagepar tyrahell » 01 Avr 2010, 15:52

Bonjour,

J'essaie de créer un rendu hors écran au sein de mon application OpenGL. Pour ce faire, je stock mon rendu offscreen dans une texture que je désire ensuite exporter dans un fichier image. Après une journée de recherche/lecture de tutorial au sujet des FBO, DIB, Offscreen rendering et Render to texture, je suis bloqué à l'étape "texture => image".

S'il vous plait pourriez vous m'aider à sauver ma texture dans un bitmap ?

Code: Tout sélectionner
///////////////////////////////////////////////////////////////////////////////
// Define static variable
static unsigned char texture[3 * SIZE * SIZE];
static unsigned int texture_id;
static int window_width = 512;
static int window_height = 512;

// OpenGL settings
glEnable(GL_DEPTH_TEST);

// Texture setting
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SIZE, SIZE, 0, GL_RGB,
GL_UNSIGNED_BYTE, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glLoadIdentity();
glTranslatef(0, 0, -10);
glRotatef(30, 1, 0, 0);

/* Define a view-port adapted to the texture */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(20, 1, 5, 15);
glViewport(0, 0, SIZE, SIZE);
glMatrixMode(GL_MODELVIEW);

/* Render to buffer */
glClearColor(1, 1, 1, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//DrawCube
glBegin(GL_LINE_LOOP);

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

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

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

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

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

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

glEnd();
//Ending texture
glFlush();

/* Copy buffer to texture */
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 5, 5, 0, 0, SIZE - 10, SIZE - 10);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////


Ce code créé une texture que vous pouvez voir dans le lien ci-dessous projeté sur les faces d'un cube :

Image

Comment puis je exporter cette texture dans un bitmap ?

++Tyra =)
tyrahell
Hello World, I'm new !
 
Messages: 2
Inscription: 01 Avr 2010, 15:48

Messagepar CodyX » 02 Avr 2010, 12:47

Hello tyrahell !

Et pourquoi veux tu exporter une texture dans un bitmap au juste ? :00000017:

Ensuite je vois pas trop l'intéret non plus du rendu hors écran pour ensuite sauvegarder dans un fichier ?? :00000032:

Sinon pour répondre à ta question tu dois d'abord créer ton fichier image et l'ouvrir en écriture puis enregistrer les données de ta texture sous un format
choisi(tga,bmp,png etc) :00000014:

Bon courage. :)
Avatar de l’utilisateur
CodyX
Hello World, I'm new !
 
Messages: 526
Inscription: 10 Avr 2005, 02:52

Messagepar valentin » 02 Avr 2010, 14:46

Il n'y a pas de fonction toute faite pour enregistrer une texture en .bmp.
Néanmoins, les données images étant stocké pratiquement pareil (à savoir dans un grand tableau de char -> char* data).
Tu dois pouvoir facilement en lisant la spécification d'un fichier .bmp pouvoir en recréer un à la main à l'aide d'une petite fonction que tu écriras.

De mémoire le truc à faire gaffe c'est si ton image n'est pas un multiple de 4, sur chaque fin de ligne tu dois combler avec des pixels nuls.
et aussi l'ordre RGB qui je croi est GRB...

Bon essaie et si t'as un soucis reviens vers moi à la limite, j'avais fait un loader de bmp, le saver ne devrait pas être bcp plus compliqué.

EDIT pour obtenir ton tableau de char en opengl c'est :
unsigned char* pRGB;
pRGB = new unsigned char[width*height*3];
glReadPixels(0,0,width,height,GL_RGB,GL_UNSIGNED_BYTE,pRGB);
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar deathangel » 02 Avr 2010, 16:12

Sinon j'ai peut être une méthode un peu barbare à proposer.
Tu génères ta texture et tu l'affiches à l'écran sur un quad, ensuite tu te sers de DevIL pour faire une capture d'écran et voila :p
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar CodyX » 03 Avr 2010, 15:39

Excellleeeent ! :D
Avatar de l’utilisateur
CodyX
Hello World, I'm new !
 
Messages: 526
Inscription: 10 Avr 2005, 02:52

Messagepar tyrahell » 07 Avr 2010, 08:44

Merci pour vos réponses pour le moins, surprenante :00000005:

Le but de la manœuvre étant de réaliser un rendu offscreen HD de ma scène, j'ai réussis depuis le message précédent à :

1°) Faire le rendu offscreen de ma scène dans un buffer de texture.
2°) Lire les informations contenu dans ce buffer via glReadPixel().
3°) Écrire ces informations dans une structure BMP et les sauver sur le disque.

Le prototype est fonctionnel, j'arrive bien a sauvegarder mes textures pré-calculés dans un fichier BMP et ce sans les afficher à l'écran.

Le problème auquel je suis confronté désormais est le suivant : la définition de mes textures est limité à celle de mon écran (1280px.1024px).

Du coup je ne peux pas faire de vrai rendu offscreen HD. Auriez-vous des idées ou des méthodes pour passer outre cette limitation de résolution ?

(Je me suis déjà renseigné sur : pbuffer, FBO, HDC swap et multi rendering).

++Tyra:00000014:
tyrahell
Hello World, I'm new !
 
Messages: 2
Inscription: 01 Avr 2010, 15:48

Messagepar valentin » 07 Avr 2010, 11:25

j'ai bien une petite idée à la con qui peut marcher,

ça serait par exemple si tu veux multiplier par 2 la résolution (2*width, 2*height).

jconnais pas trop l'image ou la scène mais si tu as un contrôle sur la caméra assez facilement tu peux stocké 4 image, celle d'origine [PIC1], celle décalé d'un demi pixel vers le haut [PIC2], d'un demi pixel vers la droite [PIC3]et décalé d'un demi pixel vers le haut et la droite[PIC4].
Le décalage de la caméra devrait pouvoir s'obtenir avec un ptit calcul jpense pas trop difficilement.
et avec ses 4 images tu en reconstruit une seule ou les pixels dans lordre représenterai

... ... ...
PIC2(0,1) PIC4(0,1) PIC2(1,1) PIC4(1,1) PIC2(2,1) PIC4(2,1) ...
PIC1(0,1) PIC3(0,1) PIC1(1,1) PIC3(1,1) PIC1(2,1) PIC3(2,1) ...
PIC2(0,0) PIC4(0,0) PIC2(1,0) PIC4(1,0) PIC2(2,0) PIC4(2,0) ...
PIC1(0,0) PIC3(0,0) PIC1(1,0) PIC3(1,0) PIC1(2,0) PIC3(2,0) ...

voilà un truc du genre donc finalement pour chaque pixel d'origine t'en a maintenant 4.

Ya surement mieux c'est la première idée qui m'est venu, si j'en ai d'autre jte les dirais bon courage et tien nous au courant
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar CodyX » 07 Avr 2010, 17:13

Avec glViewport ?
Avatar de l’utilisateur
CodyX
Hello World, I'm new !
 
Messages: 526
Inscription: 10 Avr 2005, 02:52


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

cron