Problem: glBindTexture /OpenGL /Windows XP
-
Hi, also ich habe nicht ein Problem wo etwas nicht funktioniert sondern ein Problem wo etwas funktioniert was meiner Meinung nach nicht funktionieren darf ?!
Also hier ist erst mal der CodeGLuint COpenGL::LoadGLTexture(string sFileName, int iFilterMode) { if(!bInit) return false; GLuint uiTexture = 0; AUX_RGBImageRec *pTextureImage = 0; if (pTextureImage = LoadBMP(sFileName)) { glGenTextures(1, &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) { delete[] pTextureImage->data; } delete[] pTextureImage->data; } return uiTexture; }So in diesem Code kommt NICHT der Befehl glBindTexture() vor welcher ja dafür sorgt dass eine Texture auch WIRKLICH an eine "Wand" "geklebt" wird, doch wenn nach Aufruf von diesem Code objekte geziechnet werden sind sie von der Textur beklebt... WIESO ? der Code oben führt doch nicht im hintergrund glBindTexture aus oder ?
Gruß Chris
-
nagut hab ne lösung gefunden ist zwar iwie nicht wirklich sauber damit gehts:
nach glGenTextures einfach glBindTexture aufrufen und ist diese Txture gebunden und ich kann jederzeit eine andere wählen ... das ging vorher nicht xD danke trotzdem
Gruß Chris
-
Das Verhalten, das du beschreibst, ist eigentlich logisch, weil die OpenGL Version 1.0 glBindTexture() noch nicht kannte, wahrscheinlich, weil es damals noch keine dedizierte Grafikhardware mit eigenem Speicher gab. Es musste also jede Textur mit Hilfe von glTexImage*D() vorbereitet werden. Als in OpenGL 1.1 glBindTexture() eingeführt wurde, wollte man wohl mit der Kompatibilität nicht brechen, also ist auch ohne glBindTexture() eine Textur gebunden, wahrscheinlich die mit der ID, die dir der erste Aufruf von glGenTextures() zurückgibt.
Foxx90 schrieb:
nach glGenTextures einfach glBindTexture aufrufen und ist diese Txture gebunden und ich kann jederzeit eine andere wählen ... das ging vorher nicht xD
Was soll daran unsauber sein? So funktioniert Texturemapping in OpenGL...
Um untexturiert zu rendern, solltest du aber nicht auf eine leere Textur wechseln, sondern Texturemapping mitglDisable(GL_TEXTURE_2D)deaktivieren...
Grüße
Martin
-
ahhh das ist eine gute idee, und das gegenstück dazu heißt dann natürlich
glEnable(GL_TEXTURE_2D) odeR ?=
Gruß Chris
-
also ich hab das jetzt mal ausprobiert, aber andauernd , glEnable bzw glDisable zu verwenden, wenn man mal Texture haben will und mal nicht ist nicht grade schnell ... gibt es da andere Metoden ?
Gruß Chris
-
einfach:
du machst dir zwei "haufen", naemlich texturierte und untexturierte objekte.
wenn du erstere anfaengst zu zeichnen, schaltest du das texturing einmal an und am ende wieder aus.allgemeiner:
eine liste von "materialien" welche wiederum eine liste von objekten fuehren.
die renderstates eines materials werden so nur einmal gesetzt.
konsequenter weise sollte sich das "material" die geometrie-daten so aufbereiten koennen (vertex-buffer, -parameter, etc) wie sie benoetigt werden.