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 texturenProblem -> 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 zwischenglNewList();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ß Chrisum 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