[OpenGL] Beleuchtung
-
Hallo zusammen,
ich initialisiere die Beleuchtung folgendermaßen
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); GLfloat light_position[] = {-100, 10, 50, 0}; glLightfv(GL_LIGHT0, GL_POSITION, light_position); GLfloat light_amb[] = {1, 1, 1, 1}; GLfloat light_spec[] = {1., 1., 1., 1}; GLfloat light_diff[] = {1, 1, 1, 1}; glLightfv(GL_LIGHT0, GL_AMBIENT, light_amb); glLightfv(GL_LIGHT0, GL_SPECULAR, light_spec); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diff);Ich zeichne nun Kugeln mit folgender Funktion
void PrepareParticles() { quadratic3=gluNewQuadric(); Particles = glGenLists(1); glNewList(Particles, GL_COMPILE); for (unsigned int i = 0; (i<particles.size()); i++) { int c1, c2, c3; switch (particles[i].color) { case 0x00: c1 = 255; c2 = 255; c3 = 246; break; case 0x01: c1 = 255; c2 = 220; c3 = 24; break; case 0x02: c1 = 254; c2 = 162; c3 = 3; break; case 0x03: c1 = 239; c2 = 101; c3 = 2; break; case 0x04: c1 = 215; c2 = 39; c3 = 101; break; case 0x05: c1 = 177; c2 = 0; c3 = 152; break; case 0x06: c1 = 77; c2 = 2; c3 = 154; break; case 0x07: c1 = 0; c2 = 1; c3 = 47; break; } glColor3ub(c1, c2, c3); GLfloat mat[] = {c1, c2, c3, 1}; glMaterialfv(GL_FRONT, GL_AMBIENT, mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat); glMaterialfv(GL_FRONT, GL_SPECULAR, mat); glPushMatrix(); glTranslatef((particles[i].x - move_x)* scale, (particles[i].z * scale), -(particles[i].y * scale) - MOVE_Z); gluSphere(quadratic3, 3, 32, 32); glPopMatrix(); } glEndList(); }Mein Problem ist nun, dass die Kugeln bei den "hellen" Farben (case 0x00 bis 0x03)weiss aussehen und beim letzten Fall eher hellblau statt fast schwarz. Weiss jemand, was ich ändern muss, um eher die Ursprungsfarben zu erhalten.
Gruss
Lodo2609
-
glColor3ub(c1, c2, c3); GLfloat mat[] = {c1, c2, c3, 1}; glMaterialfv(GL_FRONT, GL_AMBIENT, mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat); glMaterialfv(GL_FRONT, GL_SPECULAR, mat);Wenn du unsigned byte als Typ benutzt, dann stimmt deine Farbangabe von [0;255]. Bei float-Typen dagegen geht es von [0;1]. wobei 1 die maximale Intensität darstellt. Du übergibts das Material als float, da werden also Farbangaben im Bereich 0..1 erwartet. Alle Werte drüber werden als 1 interpretier.
c1 = 255;c2 = 220;c3 = 24; wird also zu (1,1,1) -> und das ist weiß.
c1 = 0;c2 = 1;c3 = 47; wird also zu (0,1,1) -> türkisIch würde dir generell empfehlen, gleich alles mit float zu machen und nicht das 0..255-Gemehre.
-
Danke Pellaeon.
das war die Lösung meines Problems, manchaml sieht man den Wald vor Bäumen nicht.
Gruss Lodo2609