Bonjour,
j'espère que je ne dérange personne surtout que j'ai l'impression que c'est une question souvent posée.
Je suis débutantet je veux mettre une texture sur toute la surface de ma fenêtre.
Mon fichier image est de taille 1024 * 768. Je sais comment mettre la texture au fond et ça marche ( ... enfin presque, parce qu'au sinon je n'aurai pas posté ).
Sur un PC sur deux le programme rame lamentablement. Pour toutes mauvaises langues qu'on peut trouver, ce n'est pas un problème entre ATI et Nvidia. ( j'ai testé)
C'est quand même un problème de carte graphique , car en venant ici j'ai vu que certaines ne peuvent pas gérée la chose facilement tant que les textures ne sont pas des puissances de 2.
Bon, comme je pense savoir programmer, je me suis dit, découpons cette texture en mémoire.
Soit j'ai ma texture en mémoire dans un unique tableau de 1024*768*3 cases ( du RGB ) et je veux faire 16 * 12 tableaux de 64*64*3 cases ( OK , j'espère que je me fais comprendre ). Mon image est découpé en morceaux de 64 pixels sur 64.
Après chaque bloc , je le met dans une texture OpenGL.
Voici le code qui fait ceci :
data est mon image
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 #define FRAGMENT_SIZE 64 void Image :: segmentTexture(unsigned char* data ) { unsigned int indice1 = sizeY/FRAGMENT_SIZE; unsigned int indice2 = sizeX/FRAGMENT_SIZE; unsigned char *****blocks = NULL; /* Construction */ blocks = new unsigned char ****[indice1]; // 12 for ( unsigned int i = 0 ; i < indice1 ; i++ ) blocks[i] = new unsigned char ***[indice2]; // 16 for ( unsigned int i = 0 ; i < indice1 ; i++ ) for ( unsigned int j = 0 ; j < indice2 ; j++ ) blocks[i][j] = new unsigned char **[FRAGMENT_SIZE]; // 64 for ( unsigned int i = 0 ; i < indice1 ; i++ ) for ( unsigned int j = 0 ; j < indice2 ; j++ ) for ( unsigned int k = 0 ; k < FRAGMENT_SIZE ; k++ ) blocks[i][j][k] = new unsigned char *[FRAGMENT_SIZE]; // 64 for ( unsigned int i = 0 ; i < indice1 ; i++ ) for ( unsigned int j = 0 ; j < indice2 ; j++ ) for ( unsigned int k = 0 ; k < FRAGMENT_SIZE ; k++ ) for ( unsigned int l = 0 ; l < FRAGMENT_SIZE ; l++ ) blocks[i][j][k][l] = new unsigned char [3]; // 3 // Copie unsigned int lv3 = 0; unsigned int counter = 0; for ( unsigned int i = 0 ; i < sizeY*sizeX ; i++ ) { //std::cout << " ??Lop " << std::endl; unsigned int lv1 = i%(64); unsigned int lv2 = i/(64*16); unsigned int lv4 = i/(64*64*16); //unsigned char j = i%3; lv2 = lv2 % 64; if ( lv1 == 0 && i != 0 ) lv3++; if ( lv3 == 16 ) lv3 = 0; //std::cout << " blocks[ " << lv4 << " ][ " << lv3 << " ][ " << lv2 << " ][ " << lv1 << " ]" << std::endl; for ( unsigned char j = 0 ; j < 3 ; j++ ) { counter++; blocks[lv4][lv3][lv2][lv1][j] = data[(i*3)+j]; } } // Surfacage nb_texture = 12*16; texture = new unsigned int [16*12]; //texture =(unsigned int* ) malloc (16*12*sizeof(unsigned int)); glGenTextures(nb_texture, texture); // Create The Texture // Typical Texture Generation Using Data From The Bitmap unsigned int count = 0; for ( unsigned int i = 0 ; i < 12; i++ ) { for ( unsigned int j = 0 ; j < 16 ; j++ ) { glBindTexture(GL_TEXTURE_2D, texture[count]); count++; glTexImage2D(GL_TEXTURE_2D, 0, 3, FRAGMENT_SIZE, FRAGMENT_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, blocks[i][j]); glBindTexture(GL_TEXTURE_2D, 0); } } /* Destruction */ for ( unsigned int i = 0 ; i < indice1 ; i++ ) for ( unsigned int j = 0 ; j < indice2 ; j++ ) for ( unsigned int k = 0 ; k < FRAGMENT_SIZE ; k++ ) for ( unsigned int l = 0 ; l < FRAGMENT_SIZE ; l++ ) delete blocks[i][j][k][l]; for ( unsigned int i = 0 ; i < indice1 ; i++ ) for ( unsigned int j = 0 ; j < indice2 ; j++ ) for ( unsigned int k = 0 ; k < FRAGMENT_SIZE ; k++ ) delete blocks[i][j][k]; // 64 for ( unsigned int i = 0 ; i < indice1 ; i++ ) for ( unsigned int j = 0 ; j < indice2 ; j++ ) delete blocks[i][j]; // 64 for ( unsigned int i = 0 ; i < indice1 ; i++ ) delete blocks[i]; // 16 delete [] blocks; delete blocks; }
sizeX et sizeY sont la taille de cette image ( je suis dans une classe bien à moi)
Bonne chance avec ce code; Je sais qu'il n'est pas très propre , vu que c'est en version de développement , et que c'est peut être idiot la méthode que je procède.
Le code d'affichage est correct , je passe en revue toute les textures et je les colles sur ma fenêtre , dans le mode 2D de la taille de la fenêtre ( gluOrtho2D ).
L'application fonctionne mais au lieu d'avoir mes textures , je n'ai que des carrés blancs ( genre il trouve pas le fichier ) ( bien sur le fichier existe , donc c'est mon code qui est nul ).
Je suis prêt à écouter toute vu suggestion.
( Il se peut aussi , que en n'ayant pas lu toute la doc d'OpenGL il existe une fonction qui le faisse pour moi; dans ce cas quel est telle ( juste pour orienter mes recherches )
Merci
Partager