textureproblem bei milkshape model in opengl



  • ja genau mit dem anhaltspunkt hab ich gemerkt dass in der zeile:

    m_pMaterials[i].m_texture = LoadGLTexture( m_pMaterials
    [i].m_pTextureFilename );

    nicht wirklich was passiert, weil "m_pMaterials[i].m_texture" dannach immer noch 0 ist.

    fakt ist: m_pMaterials[i].m_pTextureFilename = "./holztex.bmp" und befindet sich im selben ordner wie das model

    und hier LoadGLTexture (by NeheTutorial):

    AUX_RGBImageRec *LoadBMP(const char *Filename)				
    {
    	FILE *File=NULL;											
    	if (!Filename)												
    		return NULL;											
    
    	File=fopen(Filename,"r");									
    
    	if (File)													
    	{
    		fclose(File);											
    		return auxDIBImageLoad(Filename);						
    	}
    	return NULL;												
    }
    
    GLuint LoadGLTexture( const char *filename )				
    {
    	AUX_RGBImageRec *pImage;									
    	GLuint texture = 0;											
    
    	pImage = LoadBMP( filename );								
    
    	if ( pImage != NULL && pImage->data != NULL )	
    	{
    		glGenTextures(1, &texture);					
    
    		glBindTexture(GL_TEXTURE_2D, texture);
    		glTexImage2D(GL_TEXTURE_2D, 0, 3, pImage->sizeX,
                       pImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, pImage->data);
    
                    glTexParameteriGL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
                  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    
    		free(pImage->data);											
    		free(pImage);												
    	}
    	return texture;													
    }
    

    scheint doch alles zu klappen

    #edit
    der texturepfad muss ja kein absoluter pfad sein



  • aber beim pfeil kommt heraus, dass m_pMaterials[materialIndex].m_texture < 0 ist

    if ( m_pMaterials[materialIndex].m_texture > 0 )
    

    ich wuerde eher genau 0 vermuten.



  • ups mein fehler statt "<" "="

    aber warum ist es eig 0? es wird doch so ziemlich ordnungsgemäss geladen



  • 0 ist die erste legale texture-id die in einem jungfraeulichem opengl-context vergeben wird.
    macht doch auch sinn...



  • ja das ergibt sinn und das hab ich mir am anfang auch gedacht.
    nun stelle ich mir noch die frage wieso die texture auf 0 gestellt wird wenn der pfad nicht existiert oder kaputt ist:

    void Model::reloadTextures()
    {
       for ( int i = 0; i < m_numMaterials; i++ )
          if ( strlen( m_pMaterials[i].m_pTextureFilename ) > 0 )
             m_pMaterials[i].m_texture = LoadGLTexture( m_pMaterials[i].
                                                            m_pTextureFilename );
    
          else
             m_pMaterials[i].m_texture = 0;
    
    }
    

    das würde heissen dass eine illegale texture 0 enthält

    warum hat meine texture aber den wert 0 wenn ...m_pTextureFilename grösser als 0 ist? das ist ein gaaanz dummer fehler, den ich hier überseh. ich hasse so fehler^^

    #edit
    bin ein schritt weiter:

    texture bekommt jetzt -1 bei nem fehler un wenns funktioniert bekommt es 0.
    es hat 0
    gut, also müsste es jetzt in draw ausgegeben werden..machsts aber net!!!

    (hier draw:)

    void Model::draw() 
    {
    	GLboolean texEnabled = glIsEnabled( GL_TEXTURE_2D );
    
    	for ( int i = 0; i < m_numMeshes; i++ )
    	{
    		int materialIndex = m_pMeshes[i].m_materialIndex;
    		if ( materialIndex >= 0 )
    		{
    			glMaterialfv( GL_FRONT, GL_AMBIENT, m_pMaterials[materialIndex].m_ambient );
    			glMaterialfv( GL_FRONT, GL_DIFFUSE, m_pMaterials[materialIndex].m_diffuse );
    			glMaterialfv( GL_FRONT, GL_SPECULAR, m_pMaterials[materialIndex].m_specular );
    			glMaterialfv( GL_FRONT, GL_EMISSION, m_pMaterials[materialIndex].m_emissive );
    			glMaterialf( GL_FRONT, GL_SHININESS, m_pMaterials[materialIndex].m_shininess );
    
    			//m_texture == 0   ?!!
    
    			if ( m_pMaterials[materialIndex].m_texture >= 0 )
    			{
    				MessageBox(0,"texture ist grösser gleich null","",0);
    
    				glBindTexture( GL_TEXTURE_2D, m_pMaterials[materialIndex].m_texture );
    				glEnable( GL_TEXTURE_2D );
    
    			}
    			else
    				glDisable( GL_TEXTURE_2D );
    		}
    		else
    			glDisable( GL_TEXTURE_2D );
    
    		glBegin( GL_TRIANGLES );
    
    			for ( int j = 0; j < m_pMeshes[i].m_numTriangles; j++ )
    			{
    				int triangleIndex = m_pMeshes[i].m_pTriangleIndices[j];
    				const Triangle* pTri = &m_pTriangles[triangleIndex];
    
    				for ( int k = 0; k < 3; k++ )
    				{
    					int index = pTri->m_vertexIndices[k];
    
    					glNormal3fv( pTri->m_vertexNormals[k] );
    					glTexCoord2f( pTri->m_s[k], pTri->m_t[k] );
    					glVertex3fv( m_pVertices[index].m_location );
    				}
    			}
    
    		glEnd();
    
    	}
    ...
    


  • hellihjb schrieb:

    0 ist die erste legale texture-id die in einem jungfraeulichem opengl-context vergeben wird.
    macht doch auch sinn...

    Nein, 0 ist eine reservierte Textur-ID, die von glGenTextures niemals zurückgeliefert wird.

    Bis auf diese Tatsache ist die Vergabe der IDs nicht festgelegt. Eine Implementierung könnte z.B. die IDs einfach aus Speicheradressen generieren, an denen sie die Daten der Texturen speichert.



  • aah ok thx das erklärt auch warum die texture 0 zugewiesen bekommt wenn der pfad nicht stimmt

    also geh ich wieder ein schritt zurück un frag mich was an "draw" falsch ist wenn texture irgentein wert über 0 ist und der pfad ./holztex.bmp heisst?

    es müsste doch funsen 😞 😮



  • Ja geht die Textur denn jetzt laden? Bekommt sie eine ID GRÖSSER 0?



  • eh ja jetz wieder^^ also

    m_pMaterials[i].m_texture = LoadGLTexture( m_pMaterials[i].m_pTextureFileName);
    
    if(m_pMaterials[i].m_texture==0)
      MessageBox(0," Diese Message wird angezeigt also texture=0","",0);
    

    aber wir ham doch gelernt:
    Die zurückgegebenen Texturnamen müssen nicht zwingend aufeinanderfolgende Integerwerte sein.
    Der reservierte Texturname 0 wird dabei NIEMALS zurückgegeben.

    dann hab ich herausgefunden, dass LoadGLTexture der texture 0 verpasst wenn die daten nicht geladen werden können.
    vll is ja der pfad falsch also hab ich ihn direkt eingegeben:

    m_pMaterials[i].m_texture = LoadGLTexture("C:\\christoph\\holztex.bmp");
    

    texture hatte jetz nichtmehr 0 sondern grösser.
    also liegt der fehler an an dem pfad (warum?)
    aber die texture wird immer noch nicht angezeit dh der 2. fehler liegt an draw 😞



  • texture hatte jetz nichtmehr 0 sondern grösser.
    aber die texture wird immer noch nicht angezeit

    ich mutmasse mal, dass die ausmasse deiner textur keine zweierpotenzen sind.



  • VERDAMMT es funktioniert THX!( ich versuch mich zu revangieren(^^)), die texture war 100x100 und ich hab gedacht das wird von OGL bzw von milkshape geändert.
    nun gut die holzbox funktioniert
    aber mein mensch nicht. er besitzt eine bitmap(512x256) und die einzelnen meshes sind auf dem bitmap verschoben worden (ihr wisst schon, sie wurden 2d dargestellt und dann ein teil vom bitmap zugewiesen) (in milkshape)
    muss ich jetzt auch die 2d dargestellten meshes irgentwie (kp) auf eine 2er potenz bringen?

    danke (schonmal)

    #edit
    hat sich erledigt, ich hatte noch die holztexture drin^^
    dh wir können weiter zur letzten frage kommen un dann is echt feierabend^^
    also das ganze funktioniert nur, wen ich bei LoadGLTexture den absoluten pfad angeb. wenn ich einfach nur "tex.bmp" (tex.bmp is im selben ordner wie das model) dann gehts net?



  • ok hat sich auch erledigt. die anwendung war ja nicht im selben fenster wie die texturen un das model.

    damit wäre das thema abgeschlossen un ich danke ❤ lich allen beteiligten^^


Anmelden zum Antworten