Hello,
In my 3d project, lights don’t work correctely.
3d objects are spheres and when lights are on, lights illuminate spheres with triangles in various colors.
I don’t see a perfect smooth or diffuse light color on spheres. Only ambiant_color is ok.
Can you right my code ? i think i forgot something. Thanks verry match.
Init function : dockpInitScreen
while(1) run function : dockpPaintOutput
void gener_texture(GLuint *texture, unsigned char *image, GLuint width, GLuint height) {
// Generation et attribution du nom de texture
glGenTextures (1, texture);
// creation et utilisation de la texture
glBindTexture(GL_TEXTURE_2D, *texture);
// charge les parametres des textures
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// definition des textures
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, image);
}
static Bool
dockpInitScreen (CompPlugin *p,
CompScreen *s)
{
int i, j, c;
DOCKP_DISPLAY (s->display);
BenchScreen *bs = (BenchScreen *) calloc (1, sizeof (BenchScreen) );
s->base.privates[bd->screenPrivateIndex].ptr = bs;
WRAP (bs, s, paintOutput, dockpPaintOutput);
WRAP (bs, s, preparePaintScreen, dockpPreparePaintScreen);
WRAP (bs, s, donePaintScreen, dockpDonePaintScreen);
bs->width = 1280;
bs->height = 1024;
bs->alpha = 0.0;
glViewport(-(bs->width / 2), -(bs->height / 2), bs->width * 2, bs->height * 2);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// definit les modes de stockages des pixels
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// allocation des indexes contigus
fontOffset = glGenLists(256);
for(i = 0; i < 256; i++) {
// specifie le debut de la liste d affichage
glNewList(fontOffset + i, GL_COMPILE);
glBitmap(8, 16, 0.0, 2.0, 10.0, 0.0, letters[i]);
glEndList();
}
gener_texture(&bs->halotTex0, image_halot_0, 128, 128);
gener_texture(&bs->halotTex1, image_halot_1, 128, 128);
gener_texture(&bs->iconeTex[0], image_icone0, 200, 200);
gener_texture(&bs->iconeTex[1], image_icone1, 200, 200);
gener_texture(&bs->backTex, image_data, dock.width, dock.height);
// definit les proprietes de matiere des objets de la scene
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, material.specular);
glMaterialfv(GL_FRONT, GL_SPECULAR, material.specular);
//glMaterialfv(GL_FRONT, GL_SHININESS, material.shininess);
// definit les proprietes de la lumiere
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
for(i = 0; i < 10; i++) {
etoile.halot[i].actif = 0;
}
bs->curseur = XCreateFontCursor(s->display->display, XC_center_ptr);
GLERR;
return TRUE;
}
static Bool
dockpPaintOutput (CompScreen *s,
const ScreenPaintAttrib *sa,
const CompTransform *transform,
Region region,
CompOutput *output,
unsigned int mask)
{
Bool status;
CompTransform sTransform = *transform;
unsigned int i;
char str[] = "Bonjour";
DOCKP_SCREEN (s);
UNWRAP (bs, s, paintOutput);
status = (*s->paintOutput) (s, sa, transform, region, output, mask);
WRAP (bs, s, paintOutput, dockpPaintOutput);
if(bs->alpha <= 0.0)
return status;
glGetError();
glPushAttrib (GL_LIST_BIT | GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT);
GLERR;
transformToScreenSpace (s, output, -DEFAULT_Z_CAMERA, &sTransform);
glPushMatrix ();
glLoadMatrixf (sTransform.m);
glOrtho(-1, 1, -1, 1, -200, 200);
glShadeModel(GL_SMOOTH);
// activation du blending
glEnable (GL_BLEND);
// blending alpha
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// parametre les fonctions combinatoires de texturage
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// Transformation de translation
glTranslatef (dockpGetPositionX (s->display) - (float)dock.width + dock.decallage,
dockpGetPositionY (s->display), 0);
// activations
glEnable (GL_TEXTURE_2D);
glEnable (GL_MAP1_VERTEX_3);
glColor4f (1.0, 1.0, 1.0, 1.0);
glRasterPos2i(200, 200);
glListBase(fontOffset);
glCallLists(8, GL_UNSIGNED_BYTE, str);
if(etoile.actif) {
// creation et utilisation de la texture
glBindTexture (GL_TEXTURE_2D, bs->halotTex1);
// affichage du halot avec sa texture
texture_4p(etoile.halot[0].alpha, (float)etoile.halot[0].b[0], (float)etoile.halot[0].b[1],
etoile.size + (float)etoile.halot[0].b[0], etoile.size + (float)etoile.halot[0].b[1],
(float)etoile.halot[0].b[2]);
// creation et utilisation de la texture
glBindTexture (GL_TEXTURE_2D, bs->halotTex0);
// affichage du halot avec sa texture
for(i = 1; i < 20; i++)
if(etoile.halot[i].actif) {
texture_4p(etoile.halot[i].alpha, (float)etoile.halot[i].b[0], (float)etoile.halot[i].b[1],
-(float)i * 1 + etoile.size + (float)etoile.halot[i].b[0], -(float)i * 2 + etoile.size
+ (float)etoile.halot[i].b[1], (float)etoile.halot[i].b[2]);
}
}
// creation et utilisation de la texture
glBindTexture (GL_TEXTURE_2D, bs->backTex);
// affichage du plan avec sa texture
texture_4p(1.0, 0.0, 0.0, dock.width, dock.height, 0.0);
// affichage des lumieres
glLightfv(GL_LIGHT0, GL_POSITION, light[0].position);
glLightfv(GL_LIGHT0, GL_SPECULAR, light[0].color);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light[0].color);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glTranslatef(icone[0].x, 0, -25);
glScalef(1, 1, 1);
for(i=0; i < NBR_ICONES; i++) {
glTranslatef(0, 125, 0);
glScalef(.25 + icone[i].size, .25 + icone[i].size, .25);
glBindTexture (GL_TEXTURE_2D, bs->iconeTex[i]);
// specifie les donnees du tableau, vertices + normales + textures
glInterleavedArrays(GL_T2F_N3F_V3F, 0, vicone);
// affichage des icones
glDrawElements(GL_TRIANGLES, NBR_VERTICES_ICONE, GL_UNSIGNED_BYTE, indices_icone);
glScalef(1/(.25 + icone[i].size), 1/(.25 + icone[i].size), 1/.25);
}
// on detruit la texture 2D
glBindTexture (GL_TEXTURE_2D, 0);
glDisable (GL_BLEND);
glDisable (GL_TEXTURE_2D);
glDisable (GL_LIGHTING);
glDisable (GL_LIGHT0);
glDisable (GL_MAP1_VERTEX_3);
glPopMatrix();
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glColor4f (1.0, 1.0, 1.0, 1.0);
glPopAttrib();
glGetError();
return status;
}