LWJGL - Texturen flackern

Seikuassi

Aktives Mitglied
Hallo,

ich versuche momentan ein Voxel-Game zu erstellen. Dies funktioniert ganz gut. Es soll ähnlich wie Minecraft funktionieren.
Die Chunks werden durch ein 16x16x16 Byte-Array beschrieben (als Klasse definiert).
Blöcke zeichne ich mit GL_QUADS, bei denen die Texturkoordinaten gleich mit übergeben werden. Bei der Initialisierung von OpenGL (s.u.) werden die benötigten Texturen geladen und in der Methode drawBlock mit glBindTexture(GL_TEXTURE_2D,textureID[?]) verwendet.
Die Blöcke werden aneinander gerendert. Wird ein Block von 6 Blöcken umschlossen (es also unmöglich ist, den Block zu sehen), so soll er nicht gerendert werden (s. Funktion unten).

Problem:Beim Bewegen und Rotieren in der Welt, flackern alle Texturen. Aus einem Steinblock wird manchmal ein Erdblock und umgekehrt (s. Bilder weiter unten).
Aktuell habe ich als Test nur Erde und Stein als Textur mit eingebunden.

Frage: Wo ist das Problem bzw. was muss ich bei OpenGL konfigurieren, damit die Texturen richtig dargestellt werden?

Es gilt:
ID 0=Luft (nichts zeichnen)​
ID 1=Erdblock​
ID 2=Steinblock​

init-Methode, die OpenGL initialisiert:
Java:
public static void init()
throws FileNotFoundException,IOException{
	glEnable(GL_CULL_FACE); // Backface Culling aktivieren
	glEnable(GL_DEPTH_TEST); // Tiefenpuffer aktivieren
	glEnable(GL_NORMALIZE); // automatisches Normalisieren aktivieren
	glEnable(GL_TEXTURE_2D); // Texturenrendering aktivieren
	glClearColor(0.54f,0.89f,1f,1f); // Hintergrundfarbe (hellblau) festlegen
	{ // Nebel konfigurieren
		FloatBuffer buf=BufferUtils.createFloatBuffer(4);
		
		buf.put(new float[]{0.9f,0.9f,0.9f,1f}).flip();
		glFogi(GL_FOG_MODE,GL_LINEAR); // linearen Modus festlegen
		glFog(GL_FOG_COLOR,buf); // Farbe des Nebels festlegen
		glFogf(GL_FOG_START,1f); // Entfernung festlegen, in der Nebel sichtbar ist
		glFogf(GL_FOG_END,5f); // Entfernung festlegen, in der der Nebel und die Sichtweite zu Ende ist
		glHint(GL_FOG_HINT,GL_FASTEST); // Berechnung des Nebels auf Vertexbasis
		glEnable(GL_FOG); // Nebel aktivieren
	}
	{ // Texturen laden
		textureID[0]=loadTexture("/resources/textures/dirt.png");
		textureID[1]=loadTexture("/resources/textures/stone.png");
	}
	return;
}
loadTexture-Methode, die Texturen lädt und eine ID zuweist (vllt. liegt es an evtl. falsch eingestellten Mipmap-Werten?):
Java:
private static int loadTexture(String path)
throws FileNotFoundException,IOException{
	ByteBuffer buffer;
	BufferedImage img=classes.util.ResourceLoader.loadImage(path);
	int[]pixels=new int[img.getWidth()*img.getHeight()];
	int textureID;
	
	img.getRGB(0,0,img.getWidth(),img.getHeight(),pixels,0,img.getWidth());
	buffer=BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*4);
	for(int pixel=0,y=0;y<img.getHeight();y++){
		for(int x=0;x<img.getWidth();x++){
			pixel=pixels[y*img.getWidth()+x];
			buffer.put((byte)((pixel>>16)&0xFF));
			buffer.put((byte)((pixel>>8)&0xFF));
			buffer.put((byte)(pixel&0xFF));
			buffer.put((byte)((pixel>>24)&0xFF));
		}
	}
	buffer.flip();
	textureID=glGenTextures();
	glBindTexture(GL_TEXTURE_2D,textureID);
	{ // Textureeinstellungen vornehmen
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
	}
	glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,img.getWidth(),img.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,buffer);
	glGenerateMipmap(GL_TEXTURE_2D);
	return textureID;
}
draw-Methode, die Blöcke in die Szene zeichnet:
Java:
public static void draw(float x,float y,float z,float roll,float yaw){
	glMatrixMode(GL_MODELVIEW); // Modell-Matrix aktivieren
	{
		glLoadIdentity(); // Standard-Matrix laden
		glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
		glRotatef(-roll,1f,0f,0f); // X-Achse rotieren
		glRotatef(yaw,0f,1f,0f); // Y-Achse rotieren
		glTranslatef(-x,-y,z); // Position festlegen
		for(int i=0;i<classes.Game.chunks.size();i++){ // alle Chunks zeichnen
			ChunkDrawer.drawChunk(classes.Game.chunks.get(i));
		}
	}
	return;
}
drawChunk-Methode, die einen Chunk in die Szene zeichnet:
Java:
public static void drawChunk(Chunk c){
	glPushMatrix(); // Matrix auf den Stack legen
	glTranslatef((float)c.getXPos()*Chunk.X_size*BlockSize,(float)c.getYPos()*Chunk.Y_size*BlockSize,(float)c.getZPos()*Chunk.Z_size*BlockSize); // Chunk-Position festlegen
	for(short x=0;x<Chunk.X_size;x++){
		if(x!=0){
			glTranslatef(BlockSize*2,0f,0f); // Position auf der X-Achse verschieben
		}
		for(short y=0;y<Chunk.Y_size;y++){
			if(y!=0){
				glTranslatef(0f,BlockSize*2,0f); // Position auf der Y-Achse verschieben
			}
			for(short z=0;z<Chunk.Z_size;z++){
				if(z!=0){
					glTranslatef(0f,0f,BlockSize*2); // Position auf Z-Achse verschieben
				}
				if(checkBlock(c,x,y,z)==true){ // wenn Block gezeichnet werden muss
					drawBlock(c.getBlock(x,y,z),c.getBlockData(x,y,z)); // Block zeichnen
				}
			}
			glTranslatef(0f,0f,(float)-(Chunk.Z_size-1)*BlockSize*2); // Position auf der Z-Achse zuruecksetzen
		}
		glTranslatef(0f,(float)-(Chunk.Y_size-1)*BlockSize*2,0f); // Position auf der Y-Achse zuruecksetzen
	}
	glPopMatrix(); // Matrix vom Stack nehmen
	return;
}
checkBlock-Methode, die überprüft, ob ein Block gezeichnet werden muss:
Java:
private static boolean checkBlock(Chunk c,int x,int y,int z){
	if(c.getBlock(x,y,z)==0){ // wenn der Block Luft ist
		return false;
	}else if(x>0&&x<Chunk.X_size-1&&y>0&&y<Chunk.Y_size-1&&z>0&&z<Chunk.Z_size-1){ // wenn sich Bloecke um den Block befinden koennten
		if(c.getBlock(x-1,y,z)==0&&c.getBlock(x,y-1,z)==0&&c.getBlock(x,y,z-1)==0&&c.getBlock(x+1,y,z)==0&&c.getBlock(x,y+1,z)==0&&c.getBlock(x,y,z+1)==0){
			return false;
		}
	}
	return true;
}
drawBlock, die einen Block in die Welt zeichnet (glBindTexture evtl. falsch?):
Java:
private static void drawBlock(byte ID,byte data){
	if(ID==1){ // wenn ein Erdblock gezeichnet werden soll
		glBindTexture(GL_TEXTURE_2D,OpenGL.textureID[0]);
	}else if(ID==2){ // wenn ein Steinblock gezeichnet werden soll
		glBindTexture(GL_TEXTURE_2D,OpenGL.textureID[1]);
	}
	glBegin(GL_QUADS);
	{ // Zeichnung starten
		glColor3f(1f,1f,1f); // Farbe (weiss) festlegen
		// vorne
		glNormal3f(0f,0f,BlockSize);
		glTexCoord2s((short)1,(short)1);
		glVertex3f(BlockSize,BlockSize,BlockSize);
		glTexCoord2s((short)0,(short)1);
		glVertex3f(-BlockSize,BlockSize,BlockSize);
		glTexCoord2s((short)0,(short)0);
		glVertex3f(-BlockSize,-BlockSize,BlockSize);
		glTexCoord2s((short)1,(short)0);
		glVertex3f(BlockSize,-BlockSize,BlockSize);
		// hinten
		glNormal3f(0f,0f,-BlockSize);
		glTexCoord2s((short)1,(short)1);
		glVertex3f(-BlockSize,BlockSize,-BlockSize);
		glTexCoord2s((short)0,(short)1);
		glVertex3f(BlockSize,BlockSize,-BlockSize);
		glTexCoord2s((short)0,(short)0);
		glVertex3f(BlockSize,-BlockSize,-BlockSize);
		glTexCoord2s((short)1,(short)0);
		glVertex3f(-BlockSize,-BlockSize,-BlockSize);
		// links
		glNormal3f(-BlockSize,0f,0f);
		glTexCoord2s((short)1,(short)1);
		glVertex3f(-BlockSize,BlockSize,BlockSize);
		glTexCoord2s((short)0,(short)1);
		glVertex3f(-BlockSize,BlockSize,-BlockSize);
		glTexCoord2s((short)0,(short)0);
		glVertex3f(-BlockSize,-BlockSize,-BlockSize);
		glTexCoord2s((short)1,(short)0);
		glVertex3f(-BlockSize,-BlockSize,BlockSize);
		// rechts
		glNormal3f(BlockSize,0f,0f);
		glTexCoord2s((short)1,(short)1);
		glVertex3f(BlockSize,BlockSize,-BlockSize);
		glTexCoord2s((short)0,(short)1);
		glVertex3f(BlockSize,BlockSize,BlockSize);
		glTexCoord2s((short)0,(short)0);
		glVertex3f(BlockSize,-BlockSize,BlockSize);
		glTexCoord2s((short)1,(short)0);
		glVertex3f(BlockSize,-BlockSize,-BlockSize);
		// oben
		glNormal3f(0f,BlockSize,0f);
		glTexCoord2s((short)1,(short)1);
		glVertex3f(BlockSize,BlockSize,-BlockSize);
		glTexCoord2s((short)0,(short)1);
		glVertex3f(-BlockSize,BlockSize,-BlockSize);
		glTexCoord2s((short)0,(short)0);
		glVertex3f(-BlockSize,BlockSize,BlockSize);
		glTexCoord2s((short)1,(short)0);
		glVertex3f(BlockSize,BlockSize,BlockSize);
		// unten
		glNormal3f(0f,-BlockSize,0f);
		glTexCoord2s((short)1,(short)1);
		glVertex3f(BlockSize,-BlockSize,BlockSize);
		glTexCoord2s((short)0,(short)1);
		glVertex3f(-BlockSize,-BlockSize,BlockSize);
		glTexCoord2s((short)0,(short)0);
		glVertex3f(-BlockSize,-BlockSize,-BlockSize);
		glTexCoord2s((short)1,(short)0);
		glVertex3f(BlockSize,-BlockSize,-BlockSize);
	}
	glEnd();
	return;
}
Zwei Bilder noch: Das zweite Bild ist leicht nach links rotiert (man sieht, dass die Erdtexturen durch Steintexturen ersetzt wurden (es flackert)).
1.jpg
2.jpg

Danke im Voraus!

Mit freundlichen Grüßen
Seikuassi
 

Seikuassi

Aktives Mitglied
Hallo nochmal,

Problem gelöst :oops:. Die Chunks waren zu eng aneinander positioniert, sodass die Grafikkarte manchmal die eine Textur und manchmal die andere gerendert hat.
Jetzt flackert nichts mehr.
 

Seikuassi

Aktives Mitglied
Ich benutze jetzt übrigens auch VBO's, da ja glBegin() etc. nicht mehr aktuell sind.

Wen's interessiert...hier ist der init()-Code für OpenGL (hier werden weiter unten auch die VBO's initialisiert):
Java:
public static void init()
throws FileNotFoundException,IOException{
	glAlphaFunc(GL_GREATER,0f);
	glEnable(GL_ALPHA_TEST); // Alpha-Test aktivieren
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_BLEND); // Blending aktivieren
	glEnable(GL_CULL_FACE); // Backface Culling aktivieren
	glEnable(GL_DEPTH_TEST); // Tiefenpuffer aktivieren
	glEnable(GL_TEXTURE_2D); // 2D-Texturen aktivieren
	glEnable(GL_VERTEX_ARRAY); // Vertex-Arrays (VBOs) verwenden
	glClearColor(0.54f,0.89f,1f,1f); // Hintergrundfarbe (hellblau) festlegen
	{ // Nebel konfigurieren
		FloatBuffer buf=BufferUtils.createFloatBuffer(4);
		
		buf.put(new float[]{0.9f,0.9f,0.9f,1f}).flip();
		glFogi(GL_FOG_MODE,GL_LINEAR); // linearen Modus festlegen
		glFog(GL_FOG_COLOR,buf); // Farbe des Nebels festlegen
		glFogf(GL_FOG_START,1f); // Entfernung festlegen, in der Nebel sichtbar ist
		glFogf(GL_FOG_END,(float)visibility/10f); // Entfernung festlegen, in der der Nebel und die Sichtweite zu Ende ist
		glHint(GL_FOG_HINT,GL_FASTEST); // Berechnung des Nebels auf Vertexbasis
		glEnable(GL_FOG); // Nebel aktivieren
	}
	{ // Texturen laden
		textureID[0]=loadTexture("/resources/textures/dirt.png");
		textureID[1]=loadTexture("/resources/textures/stone.png");
		textureID[2]=loadTexture("/resources/textures/glass.png");
		textureID[3]=loadTexture("/resources/textures/bedrock.png");
		textureID[4]=loadTexture("/resources/textures/brick.png");
		textureID[5]=loadTexture("/resources/textures/clay.png");
		textureID[6]=loadTexture("/resources/textures/cobblestone.png");
		textureID[7]=loadTexture("/resources/textures/gravel.png");
		textureID[8]=loadTexture("/resources/textures/obsidian.png");
		textureID[9]=loadTexture("/resources/textures/sand.png");
	}
	{ // VBO's initialisieren
		ShortBuffer SbufferNormal;
		ShortBuffer SbufferTexCoord;
		FloatBuffer FbufferVertex;
		
		{ // Block
			final short[]normals={
				// vorne
				(short)0,(short)0,(short)1,
				// hinten
				(short)0,(short)0,(short)-1,
				// links
				(short)-1,(short)0,(short)0,
				// rechts
				(short)1,(short)0,(short)0,
				// oben
				(short)0,(short)1,(short)0,
				// unten
				(short)0,(short)-1,(short)0
			};
			final short[]texCoords={
				// vorne
				(short)0,(short)0,
				(short)0,(short)1,
				(short)1,(short)1,
				(short)1,(short)0,
				// hinten
				(short)0,(short)0,
				(short)0,(short)1,
				(short)1,(short)1,
				(short)1,(short)0,
				// links
				(short)0,(short)0,
				(short)0,(short)1,
				(short)1,(short)1,
				(short)1,(short)0,
				// rechts
				(short)0,(short)0,
				(short)0,(short)1,
				(short)1,(short)1,
				(short)1,(short)0,
				// oben
				(short)0,(short)0,
				(short)0,(short)1,
				(short)1,(short)1,
				(short)1,(short)0,
				// unten
				(short)0,(short)0,
				(short)0,(short)1,
				(short)1,(short)1,
				(short)1,(short)0,
			};
			final float[]vertices={
				// vorne
				-BlockSize,-BlockSize,BlockSize,
				BlockSize,-BlockSize,BlockSize,
				BlockSize,BlockSize,BlockSize,
				-BlockSize,BlockSize,BlockSize,
				// hinten
				BlockSize,-BlockSize,-BlockSize,
				-BlockSize,-BlockSize,-BlockSize,
				-BlockSize,BlockSize,-BlockSize,
				BlockSize,BlockSize,-BlockSize,
				// links
				-BlockSize,-BlockSize,-BlockSize,
				-BlockSize,-BlockSize,BlockSize,
				-BlockSize,BlockSize,BlockSize,
				-BlockSize,BlockSize,-BlockSize,
				// rechts
				BlockSize,-BlockSize,BlockSize,
				BlockSize,-BlockSize,-BlockSize,
				BlockSize,BlockSize,-BlockSize,
				BlockSize,BlockSize,BlockSize,
				// oben
				-BlockSize,BlockSize,BlockSize,
				BlockSize,BlockSize,BlockSize,
				BlockSize,BlockSize,-BlockSize,
				-BlockSize,BlockSize,-BlockSize,
				// unten
				-BlockSize,-BlockSize,-BlockSize,
				BlockSize,-BlockSize,-BlockSize,
				BlockSize,-BlockSize,BlockSize,
				-BlockSize,-BlockSize,BlockSize
			};
			
			VBO.NormalCount[0]=3; // Anzahl Normalkoordinaten pro Flaeche
			VBO.TexCount[0]=2; // Anzahl Koordinaten pro Texturvertex
			VBO.VertexCount[0]=3; // Anzahl Koordinaten pro Vertex
			{ // Puffer erstellen und initialisieren
				SbufferNormal=BufferUtils.createShortBuffer(normals.length);
				SbufferTexCoord=BufferUtils.createShortBuffer(texCoords.length);
				FbufferVertex=BufferUtils.createFloatBuffer(vertices.length);
				SbufferNormal.put(normals).flip(); // Normalen in Puffer kopieren
				SbufferTexCoord.put(texCoords).flip(); // Texturdaten in Puffer kopieren
				FbufferVertex.put(vertices).flip(); // Vertices in Puffer kopieren
				VBO.NormalSize[0]=normals.length;
				VBO.TexSize[0]=texCoords.length;
				VBO.VertexSize[0]=vertices.length;
			}
			{ // Normalen-Grafik-Puffer erzeugen
				VBO.NormalID[0]=glGenBuffers(); // Normalenpuffer auf Grafikkarte allokieren
				glBindBuffer(GL_ARRAY_BUFFER,VBO.NormalID[0]); // Normalenpuffer binden
				glBufferData(GL_ARRAY_BUFFER,SbufferNormal,GL_STATIC_DRAW); // Normalendaten in Puffer schreiben
				glBindBuffer(GL_ARRAY_BUFFER,0); // keinen Puffer binden
			}
			{ // Texture-Grafik-Puffer erzeugen
				VBO.TexID[0]=glGenBuffers(); // Texturpuffer auf Grafikkarte allokieren
				glBindBuffer(GL_ARRAY_BUFFER,VBO.TexID[0]); // Texturpuffer binden
				glBufferData(GL_ARRAY_BUFFER,SbufferTexCoord,GL_STATIC_DRAW); // Texturdaten in Puffer schreiben
				glBindBuffer(GL_ARRAY_BUFFER,0); // keinen Puffer binden
			}
			{ // Vertex-Grafik-Puffer erzeugen
				VBO.VertexID[0]=glGenBuffers(); // Vertexpuffer auf Grafikkarte allokieren
				glBindBuffer(GL_ARRAY_BUFFER,VBO.VertexID[0]); // Vertexpuffer binden
				glBufferData(GL_ARRAY_BUFFER,FbufferVertex,GL_STATIC_DRAW); // Vertexdaten in Puffer schreiben
				glBindBuffer(GL_ARRAY_BUFFER,0); // kein Puffer binden
			}
		}
	}
	return;
}
Die VBO-Klasse, in denen alle VBO's gespeichert sind:
Java:
class VBO{
	protected static int[]NormalCount=new int[2];
	protected static int[]NormalID=new int[2];
	protected static int[]NormalSize=new int[2];
	protected static int[]TexCount=new int[2];
	protected static int[]TexID=new int[2];
	protected static int[]TexSize=new int[2];
	protected static int[]VertexCount=new int[2];
	protected static int[]VertexID=new int[2];
	protected static int[]VertexSize=new int[2];
}
loadTexture()-Methode:
Java:
private static int loadTexture(String path)
throws FileNotFoundException,IOException{
	ByteBuffer buffer;
	BufferedImage img=classes.util.ResourceLoader.loadImage(path);
	int[]pixels=new int[img.getWidth()*img.getHeight()];
	int textureID;
	
	img.getRGB(0,0,img.getWidth(),img.getHeight(),pixels,0,img.getWidth()); // Pixeldaten vom Bild laden
	buffer=BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*4);
	for(int pixel=0,y=0;y<img.getHeight();y++){ // Pixel in Puffer laden
		for(int x=0;x<img.getWidth();x++){
			pixel=pixels[y*img.getWidth()+x];
			buffer.put((byte)((pixel>>16)&0xFF));
			buffer.put((byte)((pixel>>8)&0xFF));
			buffer.put((byte)(pixel&0xFF));
			buffer.put((byte)((pixel>>24)&0xFF));
		}
	}
	buffer.flip();
	textureID=glGenTextures(); // neues Texturenobjekt auf der Grafikkarte allokieren
	glBindTexture(GL_TEXTURE_2D,textureID); // Textur binden
	{ // Textureeinstellungen vornehmen
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
	}
	glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,img.getWidth(),img.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,buffer); // Bild in Puffer auf Grafikkarte kopieren
	glBindTexture(GL_TEXTURE_2D,0); // keine Textur binden
	return textureID;
}
Die setProjection()-Methode, die bei jedem Rendervorgang aufgerufen wird:
Java:
public static void setProjection(int height,int width){
	glMatrixMode(GL_PROJECTION); // Projektions-Matrix aktivieren
	{
		glLoadIdentity(); // Standard-Matrix laden
		gluPerspective(65d,(double)width/(double)height,0.1d,(double)visibility/10d); // Perspektive festlegen
	}
	return;
}
gluPerspective()-Methode, die nicht in LWJGL 3.0.0a vorhanden ist:
Java:
private static void gluPerspective(double fovY,double aspect,double zNear,double zFar){
	double fH=Math.tan(fovY/360d*Math.PI)*zNear;
	double fW=fH*aspect;
	
	glFrustum(-fW,fW,-fH,fH,zNear,zFar); // Frustum festlegen
	return;
}
freeMemory() gibt alle OpenGL-Objekte frei:
Java:
public static void freeMemory(){
	glDeleteBuffers(VBO.NormalID[0]);
	glDeleteBuffers(VBO.TexID[0]);
	glDeleteBuffers(VBO.VertexID[0]);
	for(int i=0;i<textureID.length;i++){ // Texturen freigeben
		glDeleteTextures(textureID[i]);
	}
	return;
}
Die draw-Methode wird von der Hauptklasse immer wieder neu aufgerufen (normaler Rendervorgang):
Java:
public static void draw(float x,float y,float z,float roll,float yaw){
	glMatrixMode(GL_MODELVIEW); // Modell-Matrix aktivieren
	{
		glLoadIdentity(); // Standard-Matrix laden
		glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
		glRotatef(-roll,1f,0f,0f); // X-Achse rotieren
		glRotatef(yaw,0f,1f,0f); // Y-Achse rotieren
		glTranslatef(-x,-y,z); // Position festlegen
		for(int i=0;i<classes.Game.chunks.size();i++){ // alle Chunks zeichnen
			drawChunk(classes.Game.chunks.get(i));
		}
	}
	return;
}
Die drawChunk-Methode zeichnet einen Chunk in die Szene:
Java:
private static void drawChunk(Chunk c){
	glPushMatrix(); // Matrix auf den Stack legen
	glTranslatef((float)c.getXPos()*Chunk.size*2*BlockSize,(float)c.getYPos()*Chunk.size*2*BlockSize,(float)c.getZPos()*Chunk.size*2*BlockSize); // Chunk-Position festlegen
	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glEnableClientState(GL_VERTEX_ARRAY);
	{
		glBindBuffer(GL_ARRAY_BUFFER,VBO.NormalID[0]);
		glNormalPointer(GL_SHORT,0,0l);
		glBindBuffer(GL_ARRAY_BUFFER,VBO.TexID[0]);
		glTexCoordPointer(VBO.TexCount[0],GL_SHORT,0,0l);
		glBindBuffer(GL_ARRAY_BUFFER,VBO.VertexID[0]);
		glVertexPointer(VBO.VertexCount[0],GL_FLOAT,0,0l);
	}
	for(short x=0;x<Chunk.size;x++){
		if(x!=0){
			glTranslatef(BlockSize*2,0f,0f); // Position auf der X-Achse verschieben
		}
		for(short y=0;y<Chunk.size;y++){
			if(y!=0){
				glTranslatef(0f,BlockSize*2,0f); // Position auf der Y-Achse verschieben
			}
			for(short z=0;z<Chunk.size;z++){
				if(z!=0){
					glTranslatef(0f,0f,BlockSize*2); // Position auf Z-Achse verschieben
				}
				if(c.getBlock(x,y,z)!=0){ // wenn ein solider Block gezeichnet werden soll
					glBindTexture(GL_TEXTURE_2D,textureID[c.getBlock(x,y,z)-1]); // Textur binden
					glDrawArrays(GL_QUADS,0,VBO.VertexSize[0]); // Block zeichnen
				}
			}
			glTranslatef(0f,0f,(float)-(Chunk.size-1)*BlockSize*2); // Position auf der Z-Achse zuruecksetzen
		}
		glTranslatef(0f,(float)-(Chunk.size-1)*BlockSize*2,0f); // Position auf der Y-Achse zuruecksetzen
	}
	glDisableClientState(GL_NORMAL_ARRAY);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);
	glPopMatrix(); // Matrix vom Stack nehmen
	return;
}
Zur drawChunk-Methode nochmal eine Frage: Ist es irgendwie hier möglich effizienteren Code einzuarbeiten. Ich meine, das Spiel hackt schon ein wenig. Gibt es irgendwie eine OpenGL-Lösung, bei der man nicht sichtbare Blöcke auch nicht zeichnet.
Gibt es da nicht etwas mit dem Framebuffer oder so was? Wäre dankbar für euren Rat!

MfG

Seikuassi
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T LWJGL: Terrain-Texturen / 2D-Array in Shader? Spiele- und Multimedia-Programmierung 2
X [LWJGL] Binden von Texturen per PNG File und Texture Sheet Spiele- und Multimedia-Programmierung 1
Luk10 (LWJGL) Aufwendiges Animieren von Texturen Spiele- und Multimedia-Programmierung 16
S LWJGL Texturen Spiele- und Multimedia-Programmierung 14
P LWJGL Texturen Spiele- und Multimedia-Programmierung 6
D LWJGL - 2D Texturen werden nicht dargestellt Spiele- und Multimedia-Programmierung 12
T lwjgl Texturen werden nicht gezeichnet Spiele- und Multimedia-Programmierung 23
Ivan Dolvich [LWJGL] Texturen überlagern sich Spiele- und Multimedia-Programmierung 2
coolian lwjgl glfw window zeigt nur grau an Spiele- und Multimedia-Programmierung 0
coolian slick lwjgl text darstellen mit UnicodeFont funktoniert nicht? Spiele- und Multimedia-Programmierung 11
F OpenGL (LWJGL) Shader Programmierung GLSL Spiele- und Multimedia-Programmierung 2
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
V LWJGL GUI Spiele- und Multimedia-Programmierung 1
V GUI in LWJGL 2 erstellen Spiele- und Multimedia-Programmierung 6
C GLSL Shaderprogrammierung in LWJGL 3 Spiele- und Multimedia-Programmierung 12
G Low Poly 3D LWJGL Shader Problem Spiele- und Multimedia-Programmierung 4
B LWJGL OpenGL SIGSEGV auf Linux (Verzweiflung :/) Spiele- und Multimedia-Programmierung 8
G LWJGL .obj .mtl loader Spiele- und Multimedia-Programmierung 3
G 2D animationen LWJGL Spiele- und Multimedia-Programmierung 0
pcfreak9000 "Allgemeine" Performance verbessern (LWJGL 2) Spiele- und Multimedia-Programmierung 2
G LWJGL Rendert nicht Spiele- und Multimedia-Programmierung 3
G lwjgl verwendung Spiele- und Multimedia-Programmierung 6
R [LWJGL] Skeletal Animation Spiele- und Multimedia-Programmierung 5
E LWJGL glGenVertexArrays() erzeugt doppelte IDs Spiele- und Multimedia-Programmierung 3
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
K No Lwjgl Spiele- und Multimedia-Programmierung 2
T LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) Spiele- und Multimedia-Programmierung 3
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
P java lwjgl Game Spiele- und Multimedia-Programmierung 0
T [LWJGL] Textur / File wieder freigeben Spiele- und Multimedia-Programmierung 4
F [LWJGL] Skeletal Animation 3D Spiele- und Multimedia-Programmierung 1
C Generelle Hilfe zur lwjgl Spiele- und Multimedia-Programmierung 0
D LWJGL gluLookAt "Umschauen" Problem Spiele- und Multimedia-Programmierung 0
D Problem mit Würfelanimierung in LWJGL Spiele- und Multimedia-Programmierung 7
RalleYTN LWJGL Vignette Spiele- und Multimedia-Programmierung 2
E LWJGL Switchen zwischen gluOrtho und gluPerspective Spiele- und Multimedia-Programmierung 0
RalleYTN LWJGL Rotation Spiele- und Multimedia-Programmierung 1
C LWJGL Color Picking Textures deaktivieren Spiele- und Multimedia-Programmierung 0
K FBO Framebuffer object [LWJGL] 2D tutorial gesucht Spiele- und Multimedia-Programmierung 2
K [LWJGL] 2D Tunneler Hintergrund Spiele- und Multimedia-Programmierung 7
S LWJGL 3d-spieleentwicklung Spiele- und Multimedia-Programmierung 3
H LWJGL-Renderfail Spiele- und Multimedia-Programmierung 1
Androbin LWJGL - Kollisions-Bug (Fallen) Spiele- und Multimedia-Programmierung 14
K Schiessen in 2D (LWJGL) Spiele- und Multimedia-Programmierung 2
S LWJGL Kamera Problem - Alles verzerrt Spiele- und Multimedia-Programmierung 4
U Kann nur ein Objekt mit LWJGL rendern Spiele- und Multimedia-Programmierung 2
X LWJGL | Parent.isDisplayable() must be true | wie kann man das zu true machen? Spiele- und Multimedia-Programmierung 0
X LWJGL - Anklick baren Button erstellen aber wie? Spiele- und Multimedia-Programmierung 6
U Quadrate anklicken LWJGL Spiele- und Multimedia-Programmierung 3
B LWJGL / OPENGL Kriege Depth-Test nicht hin :( Spiele- und Multimedia-Programmierung 0
B LWJGL Manche Seiten werden transparent angezeigt Spiele- und Multimedia-Programmierung 2
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
U Komische fragmente bei LWJGL Spiele- und Multimedia-Programmierung 6
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
Q LWJGL - Alpha-Probleme Spiele- und Multimedia-Programmierung 2
S [LWJGL] Zweimal selbe Textur trotz unterschiedlicher IDs Spiele- und Multimedia-Programmierung 3
O LWJGL AWTGLCanvas Tiefe auf 1 beschränkt Spiele- und Multimedia-Programmierung 5
Seikuassi LWJGL-Problem Spiele- und Multimedia-Programmierung 2
S [LWJGL] schwarzer Bildschrim beim rendern von .obj Model Spiele- und Multimedia-Programmierung 2
S [lwjgl] Renderbug bei mehreren Objekten Spiele- und Multimedia-Programmierung 2
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
S LWJGL Kamera Koordinaten invertiert. Spiele- und Multimedia-Programmierung 2
M LWJGL Text rendern Spiele- und Multimedia-Programmierung 3
B LWJGL Mauskoordinaten Spiele- und Multimedia-Programmierung 1
J LWJGL Update Schleife (Snake) Spiele- und Multimedia-Programmierung 6
B LWJGL Display.update() ist langsam Spiele- und Multimedia-Programmierung 5
R LWJGL: Performance glBegin, drawList, ... Spiele- und Multimedia-Programmierung 16
R LWJGL: Object Loader -> .obj, .c4d, ... laden Spiele- und Multimedia-Programmierung 3
R LWJGL: Textur -> unsichtbare Stellen, wie erzeugen? Spiele- und Multimedia-Programmierung 4
A LwJGL - Animation Stockt Spiele- und Multimedia-Programmierung 5
R [lwjgl] Cursor -> versetzt Zeichnen / Bild ist umgedreht Spiele- und Multimedia-Programmierung 2
R LWJGL: 3D Picking Spiele- und Multimedia-Programmierung 4
F LWJGL: Textur ändern mit GL11.readPixels Spiele- und Multimedia-Programmierung 5
F LWJGL: Licht und GL_LINES funktioniert nicht Spiele- und Multimedia-Programmierung 6
A [LWJGL] BMP Textur wird nicht richtig dargestellt Spiele- und Multimedia-Programmierung 8
S LWJGL Rechteck wird nicht gezeichnet Spiele- und Multimedia-Programmierung 6
F LWJGL: Is undefined? Spiele- und Multimedia-Programmierung 7
F LWJGL Kamerabug Spiele- und Multimedia-Programmierung 2
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
F LWJGL Dreidimensionaler Würfel Spiele- und Multimedia-Programmierung 15
P LWJGL oder OpenGL (C++) Spiele- und Multimedia-Programmierung 7
P "Tiefe" in Objekten - LWJGL Spiele- und Multimedia-Programmierung 12
T LWJGL 3D Objekt Collision: Wie? Spiele- und Multimedia-Programmierung 11
S LWJGL Kamera Frage Spiele- und Multimedia-Programmierung 2
V Komischer Fehler in LWJGL Spiele- und Multimedia-Programmierung 18
Z lwjgl oder jogl nutzen Spiele- und Multimedia-Programmierung 9
Y LWJGL Hintergrund Spiele- und Multimedia-Programmierung 7
Creylon [LWJGL] Textur wird falsch angezeigt Spiele- und Multimedia-Programmierung 12
Creylon [LWJGL] Spiel Exportieren Spiele- und Multimedia-Programmierung 2
Creylon [LWJGL] 2D Sprite Rotieren/Drehen Spiele- und Multimedia-Programmierung 6
CookieSoft LWJGL Ubuntu 12.04 Fehler Spiele- und Multimedia-Programmierung 7
E [LWJGL] Karusell, mehrere Objekte drehen sich um einen Mittelpunkt Spiele- und Multimedia-Programmierung 31
F lwjgl - Skysphere Spiele- und Multimedia-Programmierung 3
CookieSoft Slick und LWJGL Texture lag Spiele- und Multimedia-Programmierung 13
U OpenGl 1.1 (LWJGL GL11.*) und weiter? Spiele- und Multimedia-Programmierung 7
0 Grafikfehler LWJGL Spiele- und Multimedia-Programmierung 2
A LWJGL 3D Objekte Kollision Spiele- und Multimedia-Programmierung 3
S (LWJGL) VertexBufferObjects Spiele- und Multimedia-Programmierung 20
T LWJGL Grafik meines Projektes läuft nicht korrekt auf meinem iMac Spiele- und Multimedia-Programmierung 19

Ähnliche Java Themen

Neue Themen


Oben