Problème de mapping après alloc dynamique [OGL]

gilimcce Messages postés 33 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 27 septembre 2004 - 21 sept. 2004 à 11:34
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 21 sept. 2004 à 20:12
Désolé de remettre ce sujet, mais le suicide est proche....

Si quelqu'un y comprend qq chose....
Je suis revenu a quelque chose de basique :

un pointeur simple sur unsigned char pour la variable texture qui contient les pixels de mon image.

Je n'ai pas d'erreur de desallocation, mais la fonction gluBuild2DMipmaps ne mappe pas... pourtant des données lui sont transmises et elles me semblent contigues.

Je vous livre le code. J'espere que qq un aura la synthese qu'il m'a manque.

Merci....

///////////////////// MAIN ////////////////////////

int main(int argc, char **argv)
{
unsigned char *text;
....
....

/* Chargement de la texture */

text=loadJpegImage(chemin, &width, &height);
....
....

gluBuild2DMipmaps(GL_TEXTURE_2D,3,width,height,GL_RGB,GL_UNSIGNED_BYTE,text);
....
....
}

///////////////////// IMAGE ////////////////////////

unsigned char *loadJpegImage(char *fichier, int *Pt_width, int *Pt_height)
{
....
....

unsigned char *ligne;
FILE *file;

int t_width = cinfo.image_width;
int t_height = cinfo.image_height;

Pt_width = &(t_width);
Pt_height = &(t_height);

if (cinfo.jpeg_color_space==JCS_GRAYSCALE)
{
int dim_gris = (t_width * t_height);

unsigned char *image_gris = (unsigned char
*)malloc(dim_gris*sizeof(unsigned char));
if (image_gris == NULL){cout<<endl<<"Erreur d'allocation
image_gris"<<endl;exit(0);}

unsigned char *texture = (unsigned char
*)malloc(dim_gris*3*sizeof(unsigned char));
if (texture == NULL){cout<<endl<<"Erreur d'allocation
texture"<<endl;exit(0);}

#ifdef PERFORM_MEMORY_CHEKS
MEMCHEK_reportLeak();
#endif

jpeg_start_decompress(&cinfo);
ligne=image_gris;

while (cinfo.output_scanline<cinfo.output_height)
{
ligne=image_gris+t_width*cinfo.output_scanline;
jpeg_read_scanlines(&cinfo,&ligne,1);
}

jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);

// rearrangement de l'image scannee dans le tableau de texture 3D
// ici nous sommes en niveau de gris, donc on copie le meme octet dans
// chacune des 3 cases RGB

for (i=0;i<t_height;i++)
for (j=0;j<t_width;j++)
{
texture[i*t_width*3+j*3 ] = image_gris[i*t_width+j];
texture[i*t_width*3+j*3+1] = image_gris[i*t_width+j];
texture[i*t_width*3+j*3+2] = image_gris[i*t_width+j];
}

free(image_gris);

return texture;
}
}

9 réponses

gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
21 sept. 2004 à 11:51
Verifie si tu n'as pas oublié glEnable(GL_TEXTURE_2D);
0
gilimcce Messages postés 33 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 27 septembre 2004
21 sept. 2004 à 11:56
Tu sais... j'aurais vraiment aimé
mais en fait le problème remonte à loin :

Dans un premier tps, j'enregistrais mon image dans 1 tableau
3D de dimensions finies [720][1440][3]...
mais à terme, les dimensions de mes images peuvent varier (selon la planète que je souhaite modéliser), donc allocation dynamique, et c'est là que rien ne va plus

Après un problème de non contiguité des donnée, j'ai eu un problème de désallocation, puis maintenant... ça. Mon corps reste gris, pas de texture mappée.

Allé allé, d'autres idées ?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 sept. 2004 à 12:16
gilimcce > mais tu y arriveras jamais si tu n'a pas les bases du langages, sincerment tu seras beaucoup plus efficace

Pt_width = &(t_width);
Pt_height = &(t_height);

c'a na aucun sens, tu affecte des adresses qui deviendront invalide en sortie de la fonction

mets plutot

*Pt_width = t_width;
*Pt_height =t_height;

le cast du malloc n'est pas necessaire, et compile en mode c
0
gilimcce Messages postés 33 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 27 septembre 2004
21 sept. 2004 à 14:49
Bonjour djil,

ne pas aboutir n'est nullement envisageable.
Les bases... c'est pas ma formation, mais je m'efforce
de faire qq chose de clair et efficace. Merci d'y contribuer.

*Pt_width = t_width;
*Pt_height =t_height;

Oui... ça paraît (c'est) plus "sensé".
Dans le corps principal, les valeurs étaient toutefois transmises.

Concernant le cast du malloc :
en fait, j'utilise new... mais pour tester mes allocations (et les problèmes qu'elles posaient en les libérant) j'utilise une routine

#ifdef PERFORM_MEMORY_CHEKS
MEMCHEK_reportLeak();
#endif

qui ne peut travailler que sur malloc.

Mais New ne règle pas ce problème de mappage.

Lors de mes précédents posts, tu m'indiquait que gluBuild2DMipmaps attendait un pointeur sur des données contigues. Je pensais lui fournir dans ce dernier code...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 sept. 2004 à 16:51
et c'est bien ce que tu fais, donc si il y a un probleme, ca vient d'ailleur

"Oui... ça paraît (c'est) plus "sensé".
Dans le corps principal, les valeurs étaient toutefois transmises.
"

mouai, alors c'est vraiment bizar vu que tu ne les affecte pas, tu fais seulement une affactation entre 2 pointeurs a porté local
de toute facon fais toujours comme ca

*Pt_width = t_width;
*Pt_height =t_height;

la tu modifi bien les variable (dont les pointeur contienne l'adresse)
pour comprendre l'arithmetque des pointeur suffit de connaitre les operateur unaire * et &, le typage des pointeurs (et void*), le type ptrdiff_t pour stocker une difference entre deux pointeurs et la strategie des decalage d'adresse (indexation tableau, champ de struct...)

par contre tu es sur de ton code jpeg ? je connais pas la libjpeg mais je vois pas comment tu passes les données dans le buffer pointé par ligne ?
0
gilimcce Messages postés 33 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 27 septembre 2004
21 sept. 2004 à 18:54
Argh...........

j'étais pourtant sur d'avoir testé les valeurs en sortie.....

mais finalement c'est bien ça.

*Pt_width = t_width;
*Pt_height =t_height;

clap, clap.

concernant le remplissage du buffer pointant sur ligne :
chaque ligne scannée lui est rajouté tant qu'on a pas
atteint le nbre total de lignes...
mais j'imagine que tu avais deviné. Je ppourrais pas te donner
plus de détail.

Mais ça marche, enfin.
:big)
vais passer une bonne nuit.

A tout hasard, tu aurais vu mon autre message ds OpenGL
à propos des ombrages automatiques que je souhaitrais modifier ?

On me propose de coder des shader opengl... en assembleur.

Je souhaite utiliser une autre loi de diffusion que celle utilisée (non adaptée aux planètes) mais comment la court-circuiter ?
Merci.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 sept. 2004 à 19:08
ben voila

je vais voir de suite ton autre post
0
gilimcce Messages postés 33 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 27 septembre 2004
21 sept. 2004 à 20:06
"tu seras beaucoup plus efficace"

...

je sens que ça vient en effet
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 sept. 2004 à 20:12
sans te mentir, en connaissant la jpeglib, j'aurais fais ce code en 10min, et toi depuis combien de temps tu trainnes ce probleme de tableau :)

tu vois tout de suite la difference !
0
Rejoignez-nous