Problem beim Texturmapping (open gl)



  • Ich habe mir mit diesem Code eine Heightmap erzeugt die ich mit Texturen belegen möchte:

    for ( int Y = 0; Y < (vHeightMap.size()-iStepSize); Y += iStepSize ) {
    		for ( int X = 0; X < (vHeightMap.at(0).size()-iStepSize); X += iStepSize )
    		{
    			// wenn Textur initialisiert wurde ^_^ sonst würdes abstürzen
    			if(gHMapTextures[Y][X] > 0) {
    				glBindTexture(GL_TEXTURE_2D, gHMapTextures[Y][X]);
    				glGetTexLevelParameteriv (GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
    				glGetTexLevelParameteriv (GL_TEXTURE_2D, 0,GL_TEXTURE_HEIGHT, &h);
    			}
    
    			// Get The (X, Y, Z) Value For The Bottom Left Vertex
    			x = X;
    			y = vHeightMap.at(Y).at(X);
    			z = -Y;
    			if(gHMapTextures[Y][X] > 0) glTexCoord2f(0.0f, 1.0f); glVertex3i(x, y, z);// Send This Vertex To OpenGL To Be Rendered
    
    			// Get The (X, Y, Z) Value For The Top Left Vertex
    			x = X;
    			y = vHeightMap.at(Y + iStepSize).at(X);
    			z = -Y - iStepSize;
    			if(gHMapTextures[Y][X] > 0) glTexCoord2f(0.0f, 0.0f); glVertex3i(x, y, z);// Send This Vertex To OpenGL To Be Rendered
    
    			// Get The (X, Y, Z) Value For The Top Right Vertex
    			x = X + iStepSize; 
    			y = vHeightMap.at(Y + iStepSize).at(X + iStepSize);
    			z = -Y - iStepSize;
    			if(gHMapTextures[Y][X] > 0) glTexCoord2f(1.0f, 0.0f); glVertex3i(x, y, z);// Send This Vertex To OpenGL To Be Rendered
    
    			// Get The (X, Y, Z) Value For The Bottom Right Vertex
    			x = X + iStepSize; 
    			y = vHeightMap.at(Y).at(X + iStepSize);
    			z = -Y;
    			if(gHMapTextures[Y][X] > 0) glTexCoord2f(1.0f, 1.0f); glVertex3i(x, y, z);// Send This Vertex To OpenGL To Be Rendered
    		}
    	}
    

    in

    gHMapTextures[Y][X]
    

    liegen die Texturen die ich mit

    void Map::setSimpleHMapTextures(GLuint texture, int iPosX, int iPosY) {
    	if(iPosX < iWidthMap && iPosY < iLengthMap)
    		gHMapTextures[iPosX][iPosY] = texture;
    }
    

    in das Array pack. Allerdings habe ich ein Problem mit dieser Funktion:

    inline GLuint LoadBMPTexture (char *filename)
    {
    	SDL_Surface *bmpImage;
    	GLuint texid;
    
    	if((bmpImage = SDL_LoadBMP (filename) ) ){
    		glGenTextures (1, &texid);
    		glBindTexture (GL_TEXTURE_2D, texid);
    
    		glTexImage2D (GL_TEXTURE_2D, 0, 3, bmpImage->w, bmpImage->h, 0, GL_BGR, GL_UNSIGNED_BYTE, bmpImage->pixels );
    		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    
    		SDL_FreeSurface (bmpImage);
    	} 
    	else {
    		printf ("could not load image %s\n", filename );
    		texid = 0;
    	}
    	return texid;
    }
    

    Wenn ich jetzt Beispielsweise in der main.cpp die Texturen auf diese Weise lade:

    lvl.setSimpleHMapTextures(LoadBMPTexture("PLATEOX2.BMP"),1,1);
    	lvl.setSimpleHMapTextures(LoadBMPTexture("PLATEOX3.BMP"),1,2);
    

    dann wird zwar auf den richtgen Feldern die Textur gemalt, aber leider immer nur die Letzte gerendert. Ich weis überhaupt nicht warum, bzw. wie man dieses Problem umgeht.

    Ich hoffe ich das Problem verständlich geschildert. 🙄



  • Ist das Problem so schwierig, dass niemand helfen kann?



  • Also wie genau soll man das jetzt verstehen?
    Du hast deine Karte eingeteilt in mehrere Felder, und verschiedene Oberflächen und dafür entsprechend auch verschiedene Texturen, und jedes Feld kriegt je nach Terrain die entsprechende Textur zugewiesen? Und es wird aber nur die letzte textur, die du geladen hast, gerendert, oder wie?

    Aber erstmal noch etwas Anderes: Ich gehe mal davon aus, dass nicht jedes Feld eine andere Textur hat, sondern mehrere Felder auch die gleiche?

    Es wäre besser, du würdest ein Array für alle Texturen machen, die es gibt, und den jeweiligen Feldern dann nur den Index des Arrayeintrages übergeben.
    Und dann renderst du erst alle Felder mit Texturindex 0, dann Index 1 usw.

    Letzteres hat den Grund, dass Texturwechel recht aufwendig sind, und somit ist dieser weg meistens schneller, wenn du nicht Dutzende verschiedene Texturen hast.



  • ja so ist es, das mit dem array, werde ich noch verbesser; ich habe den fehler übrigens gefunden:
    ich muss glbegin in die schleife setzen und das glbindtex davor setzen... irgendwie etwas eigenartig.



  • hm na ja so ist das halt mit Opengl
    Aber ist ja eigentlich auch logisch, sonst könntest du ja beispielsweise 1 Vertex eines Dreiecks mit der einen Textur belegen und die andern beiden mit einer anderen Textur... wie soll das denn aussehen?^^


Log in to reply