Archief - OpenGL GL_CULL_FACE anders front face niet zichtbaar

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

QplQyer

Legacy Member
Hallo,

examens eindelijk gedaan dus wilde ik eens grondig met openGL beginnen, maar ik probeer nu een icosahedron te maken (stond in mijn boek: the openGL progr guide 1.4).

Nu, als ik hem aanmaak en teken zonder glEnable(GL_CULL_FACE) te aanroepen ziet ie er zo uit:

http://fupb.be/opengl2.png

Wat dus duidelijk langs geen kanten goed is, die is precies ingedeukt.
Na wat ge-experimenteer enzo riep ik dus glEnable(GL_CULL_FACE) op en dan kreeg ik dit als resultaat:

http://fupb.be/opengl3.png

Duidelijk een stuk beter (ja heb em wat laten draaien ook).
Maar nu vraag ik mij af hoe het komt dat ik glEnable(GL_CULL_FACE) nodig heb, normaal worden de dichtere faces toch 't dichtste getekend, dus waarom zie ik dan de achterste faces eerst als ik CULL_FACE niet aanzet, ik snap er niets van, mijn normals en coordinaten kloppen met de boek dus daar kan het ook niet echt aan liggen.

Code:
void display () {
	/* Laten we de pixels ff clearen */
	glClear(GL_COLOR_BUFFER_BIT);
	int i;
	glRotatef(0.01,1.0,0.0,1.0);
	glBegin (GL_TRIANGLES);
		for (i = 0; i < 20; i++) {
			// De driehoekjes (normals zijn hetzelfde, zie boek):
			//glColor3fv (&colours[i%10][0]);
			glNormal3fv(&vdata[tindices[i][0]][0]);
			glVertex3fv(&vdata[tindices[i][0]][0]);
			//glColor3fv (&colours[i%5][0]);
			glNormal3fv(&vdata[tindices[i][1]][0]);
			glVertex3fv(&vdata[tindices[i][1]][0]);
			//glColor3fv (&colours[i%7][0]);
			glNormal3fv(&vdata[tindices[i][2]][0]);
			glVertex3fv(&vdata[tindices[i][2]][0]);
		}
	glEnd ();
	glutSwapBuffers();
	/* Buffer clearen ... */
	glFlush ();
	
}
Dat is mijn code voor de display.

Code:
void init () {
	/* Onze clearing kleur kiezen */
	glClearColor (0.0, 0.0, 0.0, 0.0);
	
	/* De viewing matrix opstellen */
	glMatrixMode (GL_PROJECTION);	// de projectie-matrix
	glLoadIdentity ();	// laden van de identiteitsmatrix
	glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);	// orthogonaal assenstelsel
	glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteLight);
	glLightfv(GL_LIGHT0, GL_SPECULAR, whiteLight);
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lightModelAmbient);
	
	glShadeModel(GL_SMOOTH);
	glMaterialfv(GL_FRONT, GL_SPECULAR, matSpecular);
	glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_CULL_FACE);
	glFrontFace(GL_CCW);
	//glTranslatef(0.0,0.0,0.9);
	
}

En dat is de init, hopelijk kan iemand verklaren wat er fout gaat want ik vind dit tamelijk vreemd, zachtst gezegd.

Reck

Legacy Member
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);

OpenGL ga alleen de voorkant van polygonen renderen, als nen polygoon zenne normaal van u weg wijst, dan doet openGL ni de moeite om die te renderen.
Uwen voorkant hebt ge gedefiniëerd door GL_CCW of maw de kant van de polygoon waarvan de vertexen zijn getekend in CounterClockWise volgorde wordt beschouwd als de voorkant.

In uwen display list zit wrschl erges nen polygoon die clockwise getekend is.


enfin, das mijn gedacht, ik ben ook genen expert :p

QplQyer

Legacy Member
Ah nee, die glFrontFace heb ik gewoon veranderd als test om te zien of dat dus opbracht, die stond er oorspronkelijk dus niet, daar ligt het niet aan.

Litheon

Legacy Member
Probeert dit is bij uw init toe tevoegen...

glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do

Reck

Legacy Member
Litheon zei:
Probeert dit is bij uw init toe tevoegen...

glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glClear dan ook wel veranderen in glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Reck

Legacy Member
QplQyer zei:
Ah nee, die glFrontFace heb ik gewoon veranderd als test om te zien of dat dus opbracht, die stond er oorspronkelijk dus niet, daar ligt het niet aan.
does es glFrontFace(GL_CW); om te zien of da een zware verandering geeft, glFrontFace is immers standaard al GL_CCW dacht ik

QplQyer

Legacy Member
Reck zei:
does es glFrontFace(GL_CW); om te zien of da een zware verandering geeft, glFrontFace is immers standaard al GL_CCW dacht ik
Wel ja da heb ik dus al geprobeerd, hielp niet.
Depth buffer gebruiken helpt dus ook niet, 't kan altijd dat er triangles zijn die verkeerd georiënteerd zijn, maar ik zou het straf vinden, in de boek staat dat ze allemaal deftig georiënteerd zouden moeten zijn.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan