Domanda

Questa è OpenGL su iPhone 4.

Im disegno scena utilizzando materiali leggeri e. Qui è frammento del mio codice: glMatrixMode (GL_PROJECTION); glLoadIdentity (); glFrustumf (-1, 1, -1, 1, -1, 1);

CGFloat ambientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
CGFloat diffuseLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };
CGFloat direction[] = { 0.0f, 0.0f, -20.0f, 0 };

glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_POSITION, direction);


glShadeModel(GL_FLAT);
glEnable(GL_LIGHTING);
glDisable(GL_COLOR_MATERIAL);

float blankColor[4] = {0,0,0,1};
float whiteColor[4] = {1,1,1,1};
float blueColor[4] = {0,0,1,1};

glMaterialfv(GL_FRONT, GL_DIFFUSE, blueColor);

glEnable(GL_CULL_FACE);

glVertexPointer(3, GL_FLOAT, 0, verts.pdata);
    glEnableClientState(GL_VERTEX_ARRAY);

glNormalPointer(GL_FLOAT, 0, normals.pdata);
glEnableClientState(GL_NORMAL_ARRAY);

glDrawArrays (GL_TRIANGLES, 0, verts.size/3);

Il problema è che invece di vedere BLU colore diffuso lo vedo bianco. E svanisce se ruoto lato del modello, ma non riesco a capire il motivo per cui il suo non utilizzo il mio colore blu.

A proposito se cambio glMaterialfv (GL_FRONT, GL_DIFFUSE, blueColor) per glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, blueColor) allora io vedo il colore blu. Se lo faccio glMaterialfv (GL_FRONT, GL_DIFFUSE, blueColor); e poi glMaterialfv (GL_BACK, GL_DIFFUSE, blueColor); Vedo di nuovo colore bianco. Quindi sembra che GL_FRONT_AND_BACK spettacoli, ma resto combinazioni mostrare bianca. Chiunque può spiegare a me?

È stato utile?

Soluzione

Ciò è dovuto in senso orario

10,090 Come si faccia abbattimento lavoro? Perché non utilizzare la superficie normale?

OpenGL face culling calcola l'area firmata del primitivo riempito finestra spazio di coordinate. L'area firmato è positivo quando le coordinate finestra sono in un ordine antiorario e in senso orario negativo quando. Un'app può utilizzare glFrontFace () per specificare l'ordine, in senso antiorario od orario, deve essere interpretato come un frontale o posteriore rivolto primitiva. Un'applicazione può specificare l'abbattimento sia anteriore o posteriore facce chiamando glCullFace (). Infine, face culling deve essere attivato con una chiamata a glEnable (GL_CULL_FACE); .

OpenGL usa i tuoi proiezione spazio della finestra del primitivo per determinare faccia abbattimento per due motivi. Per creare interessanti effetti di illuminazione, è spesso opportuno precisare normali che non sono ortogonali alla superficie da approssimata. Se queste normali sono stati utilizzati per il viso abbattimento, potrebbe causare alcuni primitive per essere abbattuti erroneamente. Inoltre, uno schema dot-prodotto culling potrebbe richiedere un'inversione di matrice, che non è sempre possibile (cioè, nel caso in cui la matrice è singolare), mentre l'area firmato nello spazio intermedio viene sempre definito.

Tuttavia, alcune implementazioni OpenGL supporta l'estensione cull_vertex GL_EXT_. Se è presente questa estensione, un'applicazione può specificare una posizione occhio omogeneo nello spazio dell'oggetto. I vertici sono contrassegnati come abbattuti, in base al prodotto scalare della corrente normale con un vettore dal vertice per l'occhio. Se tutti i vertici di una primitiva vengono abbattuti, il primitivo non sia reso. In molte circostanze, utilizzando questa estensione

qui

Inoltre è possibile leggere qui

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