Merkwürdiges Problem mit Schrift und texturen



  • Hi, also ich arbeite grade die Nehe-Tuts durch, klappt auch ansich alles gut aber nun bin ich auf ein prioblem gestoßen:

    1. Ich lade meine Texturen
    2. Ich erstelle ein Font
    3. ich setze die farbe auf "grün" (glColor(0.0f, 1.0f, 0.0f)
    4. ich zeichne meine schrift (bitmap fonts)
    5. ich setze die farbe wieder auf weiß damit die texturen gleich nicht beinflußt werden
    6. ich zeichne 100 QUADS mit den texturen

    Problem -> die schrift ist nicht grün sondern rot ... und wenn ich andere texturen lade dann hat die schrift die farbe der textur .. sowas ist mir noch nie passiert und ich weiß´nicht wieso das schief geht ?!

    Etwa Code:

    //Erstellung des Font
    GLuint COpenGL::MakeFont(int iHeight, int iWidth, string sType, int iStyle, bool bUnderlined, bool bItalic, bool bStrikeOut) /* iStyle -> FW_NORMAL ... */
    {
        if(!bInit) return 0;
    
    	HFONT hNewFont;								
    	HFONT hOldFont;
    	GLuint uiBase;
    
    	uiBase = glGenLists(96);							
    
    	hNewFont = CreateFont(
        iHeight,				
    	iWidth,					
    	0,								
    	0,							
    	iStyle,			
    	bItalic,				
    	bUnderlined,				
    	bStrikeOut,							
    	ANSI_CHARSET,					
    	OUT_TT_PRECIS,				
    	CLIP_DEFAULT_PRECIS,	
    	ANTIALIASED_QUALITY,			
    	FF_DONTCARE | DEFAULT_PITCH,		
    	sType.c_str());			
    
    	hOldFont = (HFONT)SelectObject(hDC, hNewFont);          
    
    	wglUseFontBitmaps(hDC, 32, 96, uiBase);	
    	SelectObject(hDC, hOldFont);							
    	DeleteObject(hNewFont);		
    
        return uiBase;							
    }
    
    // Ausgabe des Texts
    
    void COpenGL::ShowText(string sText, GLuint uiBaseID, float fX, float fY, float fZ)			
    {
        if(!bInit) return;
    
        glRasterPos3f(fX, fY, fZ);
    	glPushAttrib(GL_LIST_BIT);						
    	glListBase(uiBaseID - 32);							
    	glCallLists(sText.size(), GL_UNSIGNED_BYTE, sText.c_str());
    	glPopAttrib();
    }
    
    // Laden von grafiken
    GLuint COpenGL::LoadGLTexture(string sFileName, int iFilterMode)						
    {
        if(!bInit) return false; 
    
        GLuint uiTexture = 0;				
    	AUX_RGBImageRec *pTextureImage = 0;				
    
    	if (pTextureImage = LoadBMP(sFileName))
    	{
    		glGenTextures(1, &uiTexture);
            glBindTexture(GL_TEXTURE_2D, uiTexture);
    
    		if(iFilterMode == FL_NO)
    		{
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);           
        		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                glTexImage2D(GL_TEXTURE_2D, 0, 3, pTextureImage->sizeX, pTextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, pTextureImage->data);
            }
    
    		else if(iFilterMode == FL_LI)
    		{
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
        		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                glTexImage2D(GL_TEXTURE_2D, 0, 3, pTextureImage->sizeX, pTextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, pTextureImage->data);
            }
    
    		else if(iFilterMode == FL_MP)
    		{
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
        		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
                gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pTextureImage->sizeX, pTextureImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pTextureImage->data);
            }
    	}
    	else return 0;
    
        /* Clean Up */
    	if (pTextureImage)								
    	{
    		if (pTextureImage->data)						
    		{
    	        free(pTextureImage->data);
    		}
    
    		free(pTextureImage->data);
    	}
    
    	return uiTexture;								
    }
    
    // Anwendung
            openGL.SetActive();
            openGL.Clear();
    
            openGL.ChangeColor(0.0f, 1.0f, 0.0f); 
            openGL.ShowText(sFrame, Font, -0.1f, 0.05f, -0.1f);  //Dieser Text hier wird aber nicht GRÜN!!!  :rage: 
    //wenn ich die texturenladung auslasse klappt das mit den Farben
    // ich steh hier echt vor einem rätsel
            for(int i = 0; i < vsText.size(); i++)
            {
                openGL.ShowText(vsText[i], Font, 0.0f, 0.05f + (i * -0.01), -0.1f); 
            }         
            openGL.SwitchToCamera(&Cam1); 
            openGL.ChangeColor(1.0f, 1.0f, 1.0f);
    
            bool bState = false;
    
        	for(int iIndex2 = 0; iIndex2 < 100; iIndex2++)
        	{    	
            	for(int iIndex = 0; iIndex < 100; iIndex++)
            	{   
                    openGL.UseTexture(FloorTexture);       
    
                	glBegin(GL_QUADS);		
                        glTexCoord2f(0.0f, 0.0f); glVertex3f(-iIndex2*5, -1.0f, -iIndex);				
                		glTexCoord2f(0.0f, 1.0f); glVertex3f(-iIndex2*5, -1.0f, -iIndex+1);
                		glTexCoord2f(1.0f, 1.0f); glVertex3f(-iIndex2*5+5, -1.0f, -iIndex+1);
                		glTexCoord2f(1.0f, 0.0f); glVertex3f(-iIndex2*5+5, -1.0f, -iIndex);											
                	glEnd();  
    
                	glBegin(GL_QUADS);		
                        glTexCoord2f(0.0f, 0.0f); glVertex3f(-iIndex2*5, 1.0f, -iIndex);				
                		glTexCoord2f(0.0f, 1.0f); glVertex3f(-iIndex2*5, 1.0f, -iIndex+1);
                		glTexCoord2f(1.0f, 1.0f); glVertex3f(-iIndex2*5+5, 1.0f, -iIndex+1);
                		glTexCoord2f(1.0f, 0.0f); glVertex3f(-iIndex2*5+5, 1.0f, -iIndex);											
                	glEnd();  
    
                    if(bState)
                    {
                        openGL.UseTexture(Texture2);     
                        bState = !bState;        
                    }
                    else if(!bState)
                    {
                        openGL.UseTexture(Texture);     
                        bState = !bState;        
                    }
    
                	glBegin(GL_QUADS);		
                        glTexCoord2f(0.0f, 0.0f); glVertex3f(-iIndex2*5, -1.0f, -iIndex);				
                		glTexCoord2f(0.0f, 1.0f); glVertex3f(-iIndex2*5, 1.0f, -iIndex);
                		glTexCoord2f(1.0f, 1.0f); glVertex3f(-iIndex2*5 + 2.0f, 1.0f, -iIndex);
                		glTexCoord2f(1.0f, 0.0f); glVertex3f(-iIndex2*5 + 2.0f, -1.0f, -iIndex);											
                	glEnd();        
                }
            }
    
            openGL.DrawBuffer();
    


  • zeig mal den code, in dem du die displaylisten für die texturemapped quads
    für die einzelnen zeichen erzeugst 🙂



  • wie meinst du das ? displaylisten für texturemapped quads ? also ich weiß was eine displaylist ist 😉 aber ich weiß grad echt nicht wie du das meinst?

    Gruß Chris



  • Foxx90 schrieb:

    wie meinst du das ? displaylisten für texturemapped quads ? also ich weiß was eine displaylist ist 😉 aber ich weiß grad echt nicht wie du das meinst?

    Gruß Chris

    du rufst

    glCallLists(sText.size(), GL_UNSIGNED_BYTE, sText.c_str());
    

    mit

    sText.c_str()
    

    als index auf. mit anderen worten, muss in deinem code etwas existieren, das
    abhängig vom zeichen (i.e. vom zeichencode) eine diplaylist erzeugt, in der
    ein quad gezeichnet wird und das zeichen selbst als textur darauf gemappt wird.
    also her mit dem code der zwischen

    glNewList();
    

    und

    glEndList();
    

    steht 😃



  • puh das jetzt echt iwie neu für mich.. bin grad bei Tut 13 (Bitmapfonts) und in diesem Tutorial kommt nichts mit glNewList oder glEndList vor ? ich bin noch nicht so 100 % fit in opengl ... also wenn du sagst du willst den code zwischen glNewList und glEndList sehen, so muss ich dich enttäuschen da ich diese befehle bisher noch nicht verwendet habe.. wenn das wichtig ist dann kläre mich bitte auf 🙂

    Gruß Chris



  • oh warte, mein fehler, der code benutzt wglUseFontBitmaps() um die displaylisten zu erzeugen. dann liegt es erst mal nicht daran, woran ich zu erst dachte 🙂
    lass mich nochmal genauer drüberschauen 😛



  • sry für die umstände die ich hier bereite .. danke schonmal 🙂
    GRuß Chris



  • versuch mal bevor du die texturierten quads zeichnest

    glEnable(GL_TEXTURE_2D);
    

    aufzurufen. nach dem zeichen gleich wieder mit

    glDisable(GL_TEXTURE_2D);
    

    deaktivieren



  • ja das wars es klappt danke! Wie bist du darauf gekommen wenn ich fragen darf ?
    Gruß Chris



  • Foxx90 schrieb:

    ja das wars es klappt danke! Wie bist du darauf gekommen wenn ich fragen darf ?
    Gruß Chris

    um ehrlich zu sein, ich weiß nicht warum es so ist 😃
    das ist nur etwas aus eigener erfahrung. wenn TEXTURE_2D aktiviert ist beeinflusst
    dies auch anderen drawing code, frag mich aber bitte nicht warum das so ist 😃


Anmelden zum Antworten