Textur lässt sich nicht blicken :(
-
Hallo zusammen!
Angenommen ich würde im Laufe einer OpenGL-Anwendung folgende Codezeilen ausführen:
//Initialisierung: //---------------- . . . //Textur wird geladen und die zugehörige Id in 'mat' abgelegt: Material *mat=new Material("test.bmp"); mat->loadTexture(); //scheint zu funktionieren //d.h.: es treten keine Fehlermeldungen auf und es wird tatsächlich eine Id zurückgeliefert und im Material hinterlegt! . . . //RenderRoutine: //-------------- . . . gluLookAt(...) usw . . . mat->apply(); //------- //wobei 'apply()' folgenden Code ausführt: glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,textureId); //------- glBegin(GL_TRIANGLES); glNormal3f(0,0,1); glTexCoord2f(1,0); glVertex3f(2,0,0); glNormal3f(0,0,1); glTexCoord2f(0.5,1); glVertex3f(0,4,0); glNormal3f(0,0,1); glTexCoord2f(0,0); glVertex3f(-2,0,0); glEnd(); mat->reset(); //------- //wobei 'reset()' folgenden Code ausführt: glDisable(GL_TEXTURE_2D); glColor3f(1.0,1.0,1.0); //-------
Jezt ist nur beim Ausführen der Anwendung von der Textur nichts zu sehen. Der Code ist doch korrekt!? Ist euch schon mal so etwas passiert? Was könnte denn den Fehler verursachen?
Für evtl. Kommentare oder vielleicht sogar Lösungsvorschläge
wär ich sehr dankbar!
Grüße,
TS++
-
Siehst du denn überhaupt irgendetwas (weisses/schwarzes Dreieck?)
-
Hallo TGGC!
Ja, das Dreieck ist zu sehen.(ist ja nur ein Test ;))
Funktioniert einwandfrei! Nur die Textur fehlt!
Komisch!?
-
kein fehler bei glError oder so?
rapso->greets();
-
Servus rapso!
Ne, kein einziger Fehler! Ich lass auch jede Menge Exceptions werfen, falls zum Beispiel beim Laden der Textur Komplikationen auftreten. Aber davon bemerk ich beim Ausführen nichts.
Es drängt sich natürlich der Verdacht auf, dass es an der Art und Weise liegen könnte, wie ich die Textur behandle. Nur dann müsste er mir doch spätestens beim Binden auf die Finger klopfen!Das ist schon mehr als merkwürdig!
-
zeig mal bitte das stücken oGL code bei dem du die textur einlädst.
rapso->greets();
-
Die Routine hab ich hier aus dem Forum
(ich hab nach einem von GLAUX unabhängigen Ansatz gesucht
- soll ja angeblich Speicherlöcher verursachen!)unsigned int texture_load(const char *filename) { unsigned int texture_id; int i; int k; gine_pixel *imagePixels; HANDLE fHandle; DWORD fSize; DWORD bytesRead; char fname[500]; LPVOID mem; HGLOBAL mem_global; HLOCAL mem_local; LPSTREAM pStream; LPPICTURE pPic; HDC deskDC; HDC tDC; HGDIOBJ old; HBITMAP bmp; long cx; long cy; RECT renderRt; int x, y; COLORREF cr; char temp[500]; // Open the file: strcpy(fname,filename); fHandle=CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); if (fHandle==INVALID_HANDLE_VALUE) { throw TMaterialException("TextureLoaderError - Textur konnte nicht " "geladen werden!"); } // Get Filesize: fSize=GetFileSize(fHandle,NULL); if (fSize==INVALID_FILE_SIZE) { throw TMaterialException("TextureLoaderError - ungültige " "Dateigröße!"); } // Allocate memory: mem_global=GlobalAlloc(GMEM_MOVEABLE,(fSize+1000)); if (mem_global==NULL) { throw TMaterialException("TextureLoaderError - Speicher konnte " "nicht reserviert werden!"); } mem=GlobalLock(mem_global); if (mem==NULL) { throw TMaterialException("TextureLoaderError - global lock!"); } // Read the file: bytesRead=0; if (!ReadFile(fHandle,mem,fSize,&bytesRead,NULL)) { GlobalUnlock(mem_global); GlobalFree(mem_global); throw TMaterialException("TextureLoaderError - ReadFile!"); } GlobalUnlock(mem_global); // Close the file: CloseHandle(fHandle); // Create the stream: if (CreateStreamOnHGlobal(mem_global,TRUE,&pStream)!=S_OK) { GlobalFree(mem_global); throw TMaterialException("TextureLoaderError - " "CreateStreamOnHGlobal!"); } // Load Image: if (OleLoadPicture(pStream, fSize, FALSE, IID_IPicture, (LPVOID *)&pPic)!=S_OK) { GlobalFree(mem_global); pStream->Release(); throw TMaterialException("TextureLoaderError - OleLoadPicture!"); } // Get Image Dimensions: deskDC=GetDC(NULL); pPic->get_Width(&cx); pPic->get_Height(&cy); renderRt.right=MulDiv(cx,GetDeviceCaps(deskDC,LOGPIXELSX),2540); renderRt.bottom=MulDiv(cy,GetDeviceCaps(deskDC,LOGPIXELSY),2540); // Render Image: tDC=CreateCompatibleDC(deskDC); bmp=CreateCompatibleBitmap(deskDC,renderRt.right,renderRt.bottom); if (!bmp) { throw TMaterialException("TextureLoaderError - " "CreateCompatibleBitmap() fehlgeschlagen!"); } old=SelectObject(tDC,bmp); renderRt.left=0; renderRt.top=0; GdiFlush(); if (pPic->Render(tDC,0,0,renderRt.right,renderRt.bottom,0,cy,cx,-cy,&renderRt)!=S_OK) { throw TMaterialException("TextureLoaderError - " "pPic->Render() fehlgeschlagen!"); } GdiFlush(); // Convert Pixels from RGB to RGBA: i=(renderRt.right*renderRt.bottom)*sizeof(gine_pixel); mem_local=LocalAlloc(LMEM_MOVEABLE,i); imagePixels=(gine_pixel*)LocalLock(mem_local); k=0; for (y=0; y<renderRt.bottom; y++) //y { for (x=0; x<renderRt.right; x++) { cr=GetPixel(tDC,x,y); imagePixels[k].r=GetRValue(cr); imagePixels[k].g=GetGValue(cr); imagePixels[k].b=GetBValue(cr); imagePixels[k].alpha=0; k++; } } LocalUnlock(mem_local); // Textur in OpenGL anlegen: glGenTextures(1, &texture_id ); glBindTexture(GL_TEXTURE_2D, texture_id); glTexImage2D(GL_TEXTURE_2D, 0, 4, renderRt.right, renderRt.bottom, 0, GL_RGBA, GL_UNSIGNED_BYTE, imagePixels); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Clean-up: GlobalFree(mem_global); LocalFree(mem_local); DeleteObject(SelectObject(tDC,old)); DeleteDC(tDC); ReleaseDC(NULL,deskDC); pPic->Release(); pPic=NULL; return(texture_id); }
Interessanter Effekt:
-> so würde das Ganze, wie erwartet, funktionieren:string path="test.bmp"; textureId=texture_load(path.c_str()); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,textureId); glBegin(GL_TRIANGLES); glNormal3f(0,0,1); glTexCoord2f(1,0); glVertex3f(2,0,0); glNormal3f(0,0,1); glTexCoord2f(0.5,1); glVertex3f(0,4,0); glNormal3f(0,0,1); glTexCoord2f(0,0); glVertex3f(-2,0,0); glEnd(); glDisable(GL_TEXTURE_2D); glColor3f(1.0,1.0,1.0);
Der Rechner ist also irgendwie nicht mit meinem Material einverstanden!
Nur, ich hab zum Beispiel mal die TextureId verfolgt: die Id wird im Zeitraum von der Generierung der Textur bis zum Rendern nicht verändert.
Und die 'apply'-Routine des Materials bietet ja auch nichts Neues:void Material::apply() { //Lighting aktivieren: glEnable(GL_LIGHTING); //TiefenTest und CullFace aktivieren: glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); //TextureMapping aktivieren: glEnable(GL_TEXTURE_2D); //Textur über die entsprechende Id anbinden: glBindTexture(GL_TEXTURE_2D,textureId); }
Aaaaah
-
Und wie genau sieht das Dreieck nun aus?
-
ich würde vermuten dass du die textur lädst während der context noch nicht gesetzt ist bzw. der falsche gesetzt ist, du mußt das natürlich erst laden nachdem oGL schon am laufen ist, also alles initialisiert wurde und hDC und hRC gesetzt sind.
rapso->greets();
-
Stinknormales weiss!
Jetzt frag ich mich natürlich, wo die Farbe herkommt! Selbst wenn ich aus dem 'reset'-Befehl des Materials die Farbanweisung entferne, bleibt der Effekt am Bildschirm erhalten. Bleibt die Farbe im Speicher?
-
Sorry rapso!
War etwas zu langsam!
Weisst Du was!? Mit dem Tipp hast Du mit hoher Wahrscheinlichkeit genau ins Schwarze getroffen. Bei meiner Testanwendung wird das Material bereits beim Erzeugen des Formulars initialisiert und somit die Textur geladen. Die eigentliche für OpenGL-Anweisungen vorgesehene Init-Routine wird etwas später aufgerufen. Das ich das übersehen konnte!
Ich schau mal, ob ich den Fehler damit beseitigen kann!
Danke für Deinen Denkanstoss!
Vielleicht haben wir ja Glück!
Jetzt muss ich aber erst mal Schulz machen!Bis Morgen!
Grüße,
TS++
-
Weiss könnte Fehler beim Textur laden oder falsch gesetzte Texturstages bedeuten, zweites kann ich mangels OpenGL Kenntnissen auch nicht ausschliessen.
-
(Studenten-)Morgen zusammen!
(ist ja schon halb elf ;))Ich konnte den Fehler tatsächlich beseitigen. Und alles nur, weil ich die Textur bereits beim Erzeugen des Formulars generiert habe.(kleine Ursache -> grosse Wirkung!)
Nochmals ein dickes Dankeschön für eure Hilfe!!!:)
Noch dazu zu so später Stunde!Grüße,
TS++