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.

Inserire l'immagine Descrizione qui

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.

Inserire l'immagine Descrizione qui

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();
}
.

È stato utile?

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 o GL_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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top