OpenGL - Textur erscheint weiß
-
Hallo zusammen,
ich google schon geschlagene zwei Stunden rum und komme nicht wirklich weiter. Ich kann normal Quadrate zeichnen und diese auch richtig einfärben. Versuche ich aber eine Textur darüber zu legen, erscheint diese weiß, bzw gar nicht. Ich hab das Gefühl, das es an der LoadTextureBMP Funktion liegt, die Textur an sich ist korrekt (hab ich auch schon ausgetauscht, wird auch richtig geladen). glGetError() liefert grundsätzlich immer 0 zurück, in der BITMAP struktur der LoadTextureBMP funktion werden die richtigen werte eingetragen ...
Ich poste einfach mal den code, den ich bis jetzt so habe:
Main:
[cpp] g.Create("Serafin",640,400,WndProc); //erstellt das Fenster und ruft die Init Funktion auf while(!done) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message == WM_QUIT) done = true; else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { g.Draw(); //Soll alles zeichnen g.Swap(); //Aufruf an SwapBuffers() } } [/cpp]
Init:
[cpp]int CGui::Init() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); int viewport[4]; glGetIntegerv(GL_VIEWPORT,viewport); glOrtho(viewport[0],viewport[0]+viewport[2],viewport[1]+viewport[3],viewport[1],-1,1); glClearColor(0.0f,0.0f,0.0f,0.0f); glShadeModel(GL_SMOOTH); glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); LoadTextureBMP("test.bmp",false); //siehe unten return 0; }[/cpp]
LoadTextureBMP:
[cpp]int CGLTexture::LoadTextureBMP(const char *fileName, bool wrap) { HBITMAP hBmp = (HBITMAP)LoadImage(NULL,(LPCTSTR)fileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION); BITMAP bm; GetObject(hBmp,sizeof(bm),&bm); if(bm.bmBitsPixel != 24) return CErrorCodes::GLTexture::FAILED_LOADING_BMP_TEXTURE; glGenTextures(1,&id); glBindTexture(GL_TEXTURE_2D,id); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,bm.bmWidth,bm.bmHeight,0,GL_RGB,GL_UNSIGNED_BYTE,bm.bmBits); int err = glGetError(); //breakpoint darunter, liefert keine Fehler return id; //id ist korrekt, 1 }[/cpp]
Draw:
[cpp] GLvoid CGui::Draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glDisable(GL_BLEND); glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,1); glBegin(GL_QUADS); glTexCoord2f(32,32); glVertex3f(32,32,0); glTexCoord2f(1.0f, 0.0f); glVertex3f(32,64,0); glTexCoord2f(1.0f, 1.0f); glVertex3f(64,64,0); glTexCoord2f(0.0f, 1.0f); glVertex3f(64,32,0); glEnd(); } [/cpp]
Ich hoffe mir kann da jemand helfen.
-
Du hast vergessen mit glTexParameteri() den Texturfilter zu setzen. Abgesehen davon hast du wohl in deinem ersten glTexCoord2f() einen kleinen Copy&Paste error
-
glBindTexture(GL_TEXTURE_2D,1);
Du musst hier schon die id nehmen die OpenGL dir liefert. Es ist nicht garantiert dass die immer 1 ist wenn man nur 1 Textur hat.
-
Anmerkung:
- GL_QUADS is departched
- glBegin und glEnd sind sehr sehr alt. (siehe OpenGL 2.x, 3.x, ...)
-
Hello schrieb:
- GL_QUADS is departched
dewas? Deprecated?
Hello schrieb:
- glBegin und glEnd sind sehr sehr alt. (siehe OpenGL 2.x, 3.x, ...)
Klar, ich schreib mir auch immer GLSL-Shader, damit ich ein einzelnes Viereck auf den Bildschirm zaubern kann.
Die Diskussion läuft (bzw. lief) aber nebenan iirc...
-
Famer schrieb:
Hello schrieb:
- GL_QUADS is departched
dewas? Deprecated?
Hello schrieb:
- glBegin und glEnd sind sehr sehr alt. (siehe OpenGL 2.x, 3.x, ...)
Klar, ich schreib mir auch immer GLSL-Shader, damit ich ein einzelnes Viereck auf den Bildschirm zaubern kann.
Die Diskussion läuft (bzw. lief) aber nebenan iirc...
Klar, um mal kurz was zu testen ist das schon in Ordnung. Nur ich denke wir haben hier jemand der entweder erst lernt oder ernsthaft damit arbeiten will. Und da sollte man den Hinweis schon erlauben. Es ist ja nicht so, dass glBegin und End nicht nur deprecated ist, sondern auch sehr schlechte performance bietet.
Zumindest Arrays sollte man verwenden, auch unter dem Gesichtspunkt damit man lernt wie man Vertices anordnet und an die Graka sendet.
My 2 Copper.
-
ich glaube wir sollten jetzt nicht anfangen in jedem thread, wo jemand ein dreieck zeichnet, einfach nur "aber das geht besser" posten, wenn es garnichts mit der fragestellung zu tun hat.
-
rapso schrieb:
ich glaube wir sollten jetzt nicht anfangen in jedem thread, wo jemand ein dreieck zeichnet, einfach nur "aber das geht besser" posten, wenn es garnichts mit der fragestellung zu tun hat.
Das gebashe von glBegin/End nervt gewaltig.
-
genervt schrieb:
Das gebashe von glBegin/End nervt gewaltig.
Und das unregistrierte user sich darüber aufregen, dass hier irgendetwas nervt ist noch viel lustiger.
Wie Scorcher24 schon schrieb, sollten Hinweise darauf, dass der immmediate-mode nicht mehr verwendet werden sollte durchaus akzeptiert werden und auch gegeben werden.
Wenn jemand anfängt OpenGL zu lernen ist es nunmal nicht einfach zu verstehen was die Unterschiede sind, was mit core-profile und compatibility-profile gemeint ist, welche Funktionalitäten in welchen Versionen verfügbar und vorhanden sind, welche Techniken schneller und welche langsamer sind etc. etc.Und wie es auch schon in vielen anderen threads erwähnt wurde macht es nunmal absolut keinen Sinn OpenGL 1.x zu lernen, wenn man wirklich Anfänger ist. Das führt zu keinem Verständniss und man muss komplett umdenken wenn man dann wirklich auf aktuellere Techniken umsteigt.
Es geht ja nicht darum jemandem zu sagen, man darf kein glBegin / glEnd etc. nutzen um mal eben schnell n Dreieck auf den Schirm zu bekommen. Es geht darum, dass Anfänger erst garnicht so beginnen sollten und sich lieber nach aktuelleren Tutorials oder Bücher umsehen sollten.