C++ Glut - ungewollte Pixel in Terrain

Chrisel

Cadet 4th Year
Registriert
Sep. 2010
Beiträge
70
Hallo alle zusammen,
ich versuche mich gerade an einem kleinen Spiel mit C++ und Glut (OpenGL). Momentan bereitet mir meine Funktion Kopfzerbrechen die ein einfaches Terrain zeichnen soll welches komplett eben ist. Das zeichnen klappt auch jedoch werden im Terrain beim übergang der einzelnen Felder Pixel angezeigt die die gleiche Farbe haben wie der Hintergrund. Anscheinend handelt es sich hier also um Lücken in meinem Terrain aber ich komme nicht drauf wie diese zustande kommen.
Hier meine Renderfunktion:

Code:
glClearColor(1,1,1,1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	float sichtweite=10.0f;
	//Blickwinkel anpassen:
	glRotatef(-gamer.breitengrad,1.0f,0.0f,0.0f);
	glRotatef(gamer.laengengrad,0.0f,0.0f,1.0f);
	//Spieler Bewegen:
	glTranslatef(-gamer.position.x,-gamer.position.y,-1.2f);
	//Spielfeld malen:
	float fieldsize=1.0f;
	for (int x=0; x<map.getwidth();x++){
		for (int y=0;y<map.getheight();y++){
			glColor3f(0,0,0);
			glBegin(GL_TRIANGLES);
				glVertex3f(0,0,0);
				glVertex3f(fieldsize,0,0);
				glVertex3f(0,fieldsize,0);

				glVertex3f(0,fieldsize,0);
				glVertex3f(fieldsize,fieldsize,0);
				glVertex3f(fieldsize,0,0);
			glEnd();
			glTranslatef(0.0f,fieldsize,0.0f);
		}
		glTranslatef(fieldsize,0,0);
		glTranslatef(0,-(fieldsize*map.getheight()),0);
	}
	
	glutSwapBuffers();
Leider klappt kein Screenshot aber wie gesagt das Terrain wird gezeichnet und zwischen den einzelnen Feldern werden an manchen Stellen Pixel angezeigt so als ob dort eine Lücke ist die eigentlich nicht entstehen dürfte. Vielleicht könnt ihr mir ja weiterhelfen:)

LG
Chrisel
 
Probier mal die Verschiebung deiner Quadrate nicht per "glTranslatef()", sondern indem du die Eckpunkte der Dreiecke entsprechend anpasst - sollte ungefähr so aussehen (ungetestet):
Code:
for (int x=0; x<map.getwidth();x++){
  for (int y=0;y<map.getheight();y++){
    glColor3f(0,0,0);
    glBegin(GL_TRIANGLES);
    glVertex3f((x + 0) * fieldsize, (y + 0) * fieldsize, 0);
    glVertex3f((x + 1) * fieldsize, (y + 0) * fieldsize, 0);
    glVertex3f((x + 0) * fieldsize, (y + 1) * fieldsize, 0);
 
    glVertex3f((x + 0) * fieldsize, (y + 1) * fieldsize, 0);
    glVertex3f((x + 1) * fieldsize, (y + 1) * fieldsize, 0);
    glVertex3f((x + 1) * fieldsize, (y + 0) * fieldsize, 0);
    glEnd();
  }
}
 
Code:
Zeile 26 "glTranslatef(0.0f,fieldsize,0.0f);"
Zeile 29 "glTranslatef(fieldsize,0,0);"
Zeile 30 "glTranslatef(0,-(fieldsize*map.getheight()),0);"

Daran liegts vermutlich. Durch das ständige (vor allem relative) Verschieben der Kamera bzw. Verändern der Modelviewmatrix entstehen Ungenauigkeiten, welche diese Fehler verursachen.

Lösungen:
Modelviewmatrix immer aus den Urpsrungswert erstellen durch "glloadidentity".
Ausserdem verändert man eigentlich nicht die Matrix beim Zeichnen eines Quads sondern das Quad selbst eg:

Code:
int Xmin = x*fieldsize;
int Zmin = z*fieldsize;
int XMax = (x+1)*fieldsize;
int ZMax = (z+1)*fieldsize;
glBegin(GL_TRIANGLES);
glVertex3f(XMIN,0,ZMIN);
glVertex3f(XMIN,0,ZMAX);
glVertex3f(XMAX,0,ZMIN);
....

Edit: Toll war jemand schneller :(
 
Zuletzt bearbeitet:
Ich kann dir da zwar nicht helfen, aber bezüglich Screenshot könntest du ja mit dem Smartphone eins machen und hier posten.
 
Probier mal fieldsize=1.1f, nur zum Test. Ist das Problem dann immernoch da, dann ist das irgendein Ungenauigkeitsproblem - Woher das genau kommt, kann ich dir aber grad nicht sagen. Vlt rechnest du single precision oder so.

Behebt das das Problem nicht, mach mal nen Tiefentest an (glEnable(DEPTH_BUFFER[_BIT])) - bin mir bei der Syntax aber nicht 100% sicher. Das kann nämlich auch sehr merkwürdige Artefakte erzeugen, wenn es aus ist.
 
Ja also wenn ich die Verschiebung in die Vertexe eintrage und nicht jedes Feld mit Translate Transformiere dann ist der fehler weg. So hätte ich normalerweise auch ein Terrain gezeichnet, jedoch ist mein Programm in Klassen geschachtelt wie zb die Klasse Feld und die Klasse Terrain. Die Klasse Terrain besitzt die methode draw() und ruft mithilfe einer 2d-forschleife von jedem im terrain enthaltenen Feld ebenfalls die klasse draw auf. So wollte ich erreichen das die Feld methode draw keinen bezug mehr zum terrain hat, umgekehrt aber doch. Hoffe das klingt verständlich:D
Wie auch immer falls euch einfällt wie man das bewerkstelligen kann bin ich für tipps offen aber sonst muss ich halt notgedrungen in der Feld-Methode "draw" x und y als parameter übergeben.
Vielen Dank für eure Hilfe:)

LG
Chrisel
 
Wenn du dein Programm schon so in Objekte bzw Klassen unterteilst, wieso gibst du nicht jedem Feld einfach seine x und y Position als Membervariable mit? Allerdings könnte man sich die Feld-Klasse wahrscheinlich je nachdem was genau du gemacht hast auch komplett sparen.

Des Weiteren ist dieses glBegin(GL_TRIANGLES) sehr sehr sehr sehr sehr langsam, da der Zeichenaufruf für jedes einzelne Dreieck über die CPU geht. Dies ist bei kleinen Terrains komplett egal, nur sofern dein Terrain mal grösser werden soll (10-100k Dreiecke) reicht die Performance nicht mehr aus. Hier empehlen sich VBOs da dabei der komplette Zeichenaufruf von der GPU abgearbeitet wird. Schau dir hierzu mal den Link den Punkt unter OpenGL 2.1 an, was man dort macht ist recht einfach und bietet viel viel bessere Performance:
http://en.wikipedia.org/wiki/Vertex_Buffer_Object
 
Zuletzt bearbeitet:
Zurück
Oben