Bonjours à tous,
je suis entrain de tester un exemple OpenGL/QT4.6,j'utilise ici le bump
mapping en utilisant un cube map de normalisation. l'exemple est simple,il affiche
un carreau,mais,,le carré s'affiche mais sans l'effet bump map!
ce que je suis certain que la faute est dans les environnements de textures,soit une mauvaise combinaison ou multiplication des unités des texture,ou quelques choses de manquants quelques parts !

voici le code de cube map de normalisation dans mon exemple:
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
 
#include"NCM.h"
 
NCM::NCM()
{}
 
NCM::~NCM()
{}
 
void NCM::create(unsigned int facesize,GLuint &id)
{
glEnable(GL_TEXTURE_CUBE_MAP);
glBindTexture(GL_TEXTURE_CUBE_MAP,id);
double *cubemap = new double [facesize*facesize*3];
double offset = 0.5;
double halfsize = facesize /2;
unsigned int x,y;
unsigned int index=0;
for(unsigned char face=0; face<=6; face++)
{
for (y=0; y<facesize; y++)
{
for (x=0; x<facesize; x++)
{
switch (face)
{
case 0:temp=new QVector3D(halfsize,y+offset-halfsize,-(x+offset-halfsize));break;
case 1:temp=new QVector3D(-halfsize,y+offset-halfsize,x+offset-halfsize );break;
case 2:temp=new QVector3D(x+offset-halfsize,-halfsize,y+offset-halfsize);break;
case 3:temp=new QVector3D(x+offset-halfsize,halfsize,-(y+offset-halfsize));break;
case 4:temp=new QVector3D(x+offset-halfsize,y+offset-halfsize,halfsize);break;
case 5:temp=new QVector3D(-(x+offset-halfsize),(y+offset-halfsize),-halfsize);break;
}
temp->normalize();
cubemap[index++]=(double)(temp->x());
cubemap[index++]=(double)(temp->y());
cubemap[index++]=(double)(temp->z());
}
}
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X+face,0,GL_RGB,facesize,facesize,0,GL_RGB,GL_UNSIGNED_BYTE,cubemap);
index=0;
}
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);
delete cubemap;
glDisable(GL_TEXTURE_CUBE_MAP);
}
et celui ci est le code d'affichage:
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
 
QVector3D *cubev1=new QVector3D(-0.5,0.5,0);
QVector3D *cubev2=new QVector3D(0.5,0.5,0);
QVector3D *cubev3=new QVector3D(0.5,-0.5,0);
QVector3D *cubev4=new QVector3D(-0.5,-0.5,0);
QVector3D *cubetv1=new QVector3D(0,1,0);
QVector3D *cubetv2=new QVector3D(1,1,0);
QVector3D *cubetv3=new QVector3D(0,0,0);
QVector3D *cubetv4=new QVector3D(1,0,0);
 
 
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
QVector3D *worldlightposition=new QVector3D(0,0,10);
float lightparams[]={worldlightposition->x(),worldlightposition->y(),worldlightposition->z(),1};
glLightfv(GL_LIGHT0,GL_POSITION,lightparams);
 
 
GLuint cubemapid;
NCM *c=new NCM();
c->create(128,cubemapid);
 
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_CUBE_MAP);
glBindTexture(GL_TEXTURE_CUBE_MAP,cubemapid);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,GL_REPLACE);
 
 
GLint normalmap=bindTexture(QImage("normal.bmp"));
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,normalmap);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB,GL_DOT3_RGB);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE0_RGB,GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE1_RGB,GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND0_RGB,GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND1_RGB,GL_SRC_COLOR);
 
 
GLint textureskin=bindTexture(QImage("brick.bmp"));
glActiveTexture(GL_TEXTURE2);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,textureskin);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 
 
QVector3D *lightvector=new QVector3D();
 
glBegin(GL_POLYGON);
*lightvector=*worldlightposition - *cubev1;
glMultiTexCoord3d(GL_TEXTURE0,lightvector->x(),lightvector->y(),lightvector->z());
glMultiTexCoord2d(GL_TEXTURE1,cubetv1->x(),cubetv1->y());
glMultiTexCoord2d(GL_TEXTURE2,cubetv1->x(),cubetv1->y());
glVertex3d(cubev1->x(),cubev1->y(),cubev1->z());
 
*lightvector=*worldlightposition - *cubev2;
glMultiTexCoord3d(GL_TEXTURE0,lightvector->x(),lightvector->y(),lightvector->z());
glMultiTexCoord2d(GL_TEXTURE1,cubetv2->x(),cubetv2->y());
glMultiTexCoord2d(GL_TEXTURE2,cubetv2->x(),cubetv2->y());
glVertex3d(cubev3->x(),cubev2->y(),cubev2->z());
 
*lightvector=*worldlightposition - *cubev3;
glMultiTexCoord3d(GL_TEXTURE0,lightvector->x(),lightvector->y(),lightvector->z());
glMultiTexCoord2d(GL_TEXTURE1,cubetv3->x(),cubetv3->y());
glMultiTexCoord2d(GL_TEXTURE2,cubetv3->x(),cubetv3->y());
glVertex3d(cubev3->x(),cubev3->y(),cubev3->z());
 
*lightvector=*worldlightposition- *cubev4;
glMultiTexCoord3d(GL_TEXTURE0,lightvector->x(),lightvector->y(),lightvector->z());
glMultiTexCoord2d(GL_TEXTURE1,cubetv4->x(),cubetv4->y());
glMultiTexCoord2d(GL_TEXTURE2,cubetv4->x(),cubetv4->y());
glVertex3d(cubev1->x(),cubev4->y(),cubev4->z());
 
glEnd();

Merci d'avance.