L'ombreggiatura OpenGL non funziona.L'oggetto sembra colorato solido
Domanda
Attualmente sto cercando di entrare in ombreggiatura OpenGL e illuminazione per visualizzare un modello 3D esportato dal frullatore in una semplice finestra di glut.
Ho provato a visualizzare il tipico GlossilidteaPot per convalidare le mie impostazioni OpenGL. Con la teiera tutto sembra perfettamente bello come si può vedere nella foto qui sotto.
Se ora voglio sostituire la teiera con il mio modello esportato da frullatore, l'ombreggiatura non funziona.Il modello (un cerchio di auto) sembra solo colorato solido. Il colore cambia quando il modello viene ruotato, ma rimane solido tutto il tempo.
Che cosa fa Glignolidteapot sotto il cofano per disegnare il modello di teiera?
Ecco il codice che sto usando per configurare OpenGL:
void SetupRC()
{
glClearColor(0.4, 0.4, 0.4, 1.0);
// Enable lighting and the light we have set up
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
//Set lighting parameters
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT,light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Enable shading
glShadeModel(GL_SMOOTH);
// Set up the projection parameters
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
}
.
E il codice per ridire i fotogrammi:
void RenderScene(void)
{
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glTranslatef(0.0, 0.0, -2.5f);
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// set input data to arrays
glVertexPointer(3, GL_FLOAT, 0, BlenderGuru_CarWheelVerts);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
GLfloat ambConst[] = { 0.24725, 0.1995, 0.0745, 1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambConst);
GLfloat diffConst[] = { 0.75164, 0.60648, 0.22648, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffConst);
GLfloat specConst[] = { 0.628281, 0.555802, 0.366065, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specConst);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 51.2);
// draw data
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, BlenderGuru_CarWheelNumVerts);
glDisableClientState(GL_VERTEX_ARRAY);
glFlush();
}
. Soluzione
Poiché stai esportando dal frullatore, i tuoi dati esportati probabilmente contengono anche normali.In caso contrario, assicurati di generarli per il tuo modello ed esportali.Hai bisogno di dati normali per il tuo illuminazione per lavorare.
La chiamata a glEnable(GL_AUTO_NORMAL);
non fa quello che potrestiPensa che lo fa.Sarà solo
.Genera vettori normali quando è utilizzato
GL_MAP2_VERTEX_3
oGL_MAP2_VERTEX_4
per generare vertici.Allora esportare i dati normali e usano questo, o forse calcolare le normali dai dati della mesh che sono disponibili.
Altri suggerimenti
Il tuo codice manca di caricare / impostare i dati normali.Senza normali, l'illuminazione non funziona.