Forum Programmation.autre OpenGL: éclairage d'un heightfield.

Posté par (page perso) .
Tags : aucun
0
10
mar.
2008

Bonjour, encore assez débutant en OpenGL, j'essaie d'écrire un rendu de heightfield pas trop moche. Après quelques essais infructueux concernant l'éclairage (mon terrain est désespérément blanc), j'ai essayé sans le moindre remords de repiquer le code d'Avogadro sur ce point, mais le chou reste de la même couleur: blanc.

Donc je soumet à la sagacité populaire mon modeste code histoire de voir si qqu'un n'aurait pas une piste: (je ne mets pas les datas parce que c'est un peu gros, mais altitude est un tableau de 32*32 contenant des valeurs... d'altitude)


void draw_point(float x, float y, float z)
/* Plots a point with a color inferred from altitude */
{
float c = ((float) z) / ((float) 0xff);
float r, g, b;
if (z < 0x70) {
r = g = c * 0.8;
b =0.8;
}
else {
if (z
r = b = c * 0.8;
g = 0.8;
} else {
r = b =g = c;
}
}
glColor4f(r,g,b,1.0);
glVertex3f(x,y,z);
}

void draw_map(aol_typ_symbology_layer *ctx)
/* this function draws the map, takes as input the layer's context so it can read the plugs */
/* beware, setting values in the context here would be a bad idea */
{
int ii;
int jj;
// glPushMatrix();
GLfloat ambientLight[] = { 0.2, 0.2, 0.2, 1.0 };
GLfloat diffuseLight[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat diffuseLight2[] = { 0.3, 0.3, 0.3, 1.0 };
GLfloat specularLight[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat specularLight2[] = { 0.5, 0.5, 0.5, 1.0 };
GLfloat position[] = { 0.8, 0.7, 1.0, 0.0 };
GLfloat position2[] = { -0.8, 0.7, -0.5, 0.0 };

/* we want smooth shading so thecolor differnces are ot too apparent */
glShadeModel(GL_SMOOTH);
glEnable( GL_LIGHTING );


glLightfv( GL_LIGHT0, GL_AMBIENT, ambientLight );
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseLight );
glLightfv( GL_LIGHT0, GL_SPECULAR, specularLight );
glLightfv( GL_LIGHT0, GL_POSITION, position );
glEnable( GL_LIGHT0 );
// Create a second light source to illuminate those shadows a little better
glLightfv( GL_LIGHT1, GL_AMBIENT, ambientLight );
glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuseLight2 );
glLightfv( GL_LIGHT1, GL_SPECULAR, specularLight2 );
glLightfv( GL_LIGHT1, GL_POSITION, position2 );
glEnable( GL_LIGHT1 );

/*putting up this baby in the right position */
glTranslatef(-32,-32 - (ctx->PN_ALTI / 512.0),32);
glRotatef(ctx->PN_ROLL_ANGLE,0.0f,0.0f,1.0f);
glRotatef(270+ctx->PN_PITCH_ANGLE ,1.0f,0.0f,0.0f);
glScalef(2.0,2.0,2.0 * 32.0 / 0xff);

/*draw the triangles ! */
glBegin(GL_TRIANGLES);
for (ii=0 ; ii < 31; ii ++) {
for (jj=0 ; jj < 31; jj++) {
draw_point(ii,jj,map[ii][jj]);
draw_point(ii+1,jj,map[ii+1][jj]);
draw_point(ii,jj+1,map[ii][jj+1]);

draw_point(ii+1,jj,map[ii+1][jj]);
draw_point(ii+1,jj+1,map[ii+1][jj+1]);
draw_point(ii,jj+1,map[ii][jj+1]);
}
}
glEnd();

glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glDisable(GL_LIGHT1);

}

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.