#0 

11-06-2009 11:45:24

knightking
Petit nouveau
Date d'inscription: 09-06-2009
Messages: 5

Bonjour,

je charge un modèle 3ds, dont les fichiers de textures sont constitués par des images PNG 16 bits (donc 65535 niveaux par canal).
La manipulation

Code:

video::IImage * image;
image = driver-> createScreenShot();
driver ->writeImageToFile(image, "image.png", 85);

me permet de récupérer le résultat du screenshot. Mais le fichier image.png est sur 8 bits (donc 255 niveaux par canal), ce qui me fait perdre énormément d'informations.
J'ai constaté qu'il y avait un type SColorf permettant de spécifier qu'une image est en flottant par canal. Cependant la fonction

Code:

beginScene(true, true, SColor(...));

ne permet pas de spécifier au driver de travailler en flottants, vu que le 3ème paramètre est un SColor.

D'où mes questions :
existe-il une façon de spécifier au driver vidéo de travailler avec de telles images 16 bits ?
Ou bien y-a-t-il moyen de spécifier lors du writeImageToFile, qu'on veut du 16 bits ?

Hors ligne


#1 

11-06-2009 18:36:16

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Device->getVideoDriver()->setTextureCreationFlag(ETCF_ALWAYS_16_BIT,true); je sais pas, peut-être...


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#2 

12-06-2009 19:40:00

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

Code:

video::IImage *image;
image = driver->createScreenShot();
image = driver->createImage(video::ECF_A1R5G5B5,image);
driver ->writeImageToFile(image, "image.png");

sa devrait le faire, sinon changer se que dit copland avans le screenshot et rétablir après si besoin est
peut-être mettre un nouveaux pointeur pour l'image en 16 bit

sinon teste avec image->copyToScaling((void*)image.....
tu peut utiliser l'operator *& pour faire une copie d'un pointeur wink

Dernière modification par Magun (12-06-2009 19:43:39)

Hors ligne


#3 

17-06-2009 16:31:22

knightking
Petit nouveau
Date d'inscription: 09-06-2009
Messages: 5

J'ai programmé les deux solutions proposées par Copland et par Magun mais elles ne fonctionnent pas. En effet, l'image que j'obtiens est une image couleur dont chaque canal Rouge, Vert, et Bleu est codé sur 255 niveaux de gris alors que je souhaite avoir 65535 niveaux de gris par canal
.
En fait le problème ne semble pas avoir de solution actuelle de par la définition même de la fonction de capture et du type IImage de Irrlicht. En effet, l'étude du fichier

Code:

 COpenGLDriver.cpp

décrivant la fonction createScreenShot()
nous indique que les images sont toutes définies ou "castées" en u8 pour chaque canal du pixel. Or la définition de u8 se trouve irrTypes.h et correspond à

Code:

00015 #ifdef _MSC_VER
00016 typedef unsigned __int8         u8;
00017 #else
00018 typedef unsigned char           u8;
00019 #endif

soit 1 octet, donc 255 valeurs possibles seulement ! :-(

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
27 invités en ligne
Aucun membre connecté
RSS Feed