dmx81 Temat założony przez niniejszego użytkownika |
[OpenGL] + [Qt] problem z wczytywaniem tekstur » 2010-10-24 03:44:41 chcialbym zaladowac jakakolwiek teksture z pliku bmp, przeczytalem wiele tutoriali i wciaz nie moge sobie z tym poradzic void GLWidget::tekstury() { QPixmap p; QString l = "1.bmp"; p.load( l ); glGenTextures( 1, & tab1 ); glBindTexture( GL_TEXTURE_2D, tab1 ); glTexImage2D( GL_TEXTURE_2D, 0, 0, p.width(), p.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, & p ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); glEnable( GL_TEXTURE_2D ); glDisable( GL_TEXTURE_1D ); }
gluLookAt( posxO, 0, poszO, posxK, 0, poszK, 0, 1, 0 ); tekstury(); glBindTexture( GL_TEXTURE_2D, tab1 ); glBegin( GL_QUADS );
glColor3f( 0.0, 0.5, 0.5 ); glTexCoord2f( 0, 0 ); glVertex3f( 0.0, 0.0, 0.0 ); glTexCoord2f( 1, 0 ); glVertex3f( 0.5, 0.0, 0.0 ); glTexCoord2f( 1, 1 ); glVertex3f( 0.5, 0.5, 0.0 ); glTexCoord2f( 0, 1 ); glVertex3f( 0.0, 0.5, 0.0 );
glColor3f( 0.5, 0.5, 0.5 ); glTexCoord2f( 0, 0 ); glVertex3f( 0.5, 0.0, - 0.5 ); glTexCoord2f( 1, 0 ); glVertex3f( 0.5, 0.5, - 0.5 ); glTexCoord2f( 1, 1 ); glVertex3f( 0.5, 0.5, 0.0 ); glTexCoord2f( 0, 1 ); glVertex3f( 0.5, 0.0, 0.0 ); /...itd
ale narysowane obiekty pokryte sa kolorem, bez tekstur (to rozwiazanie ktore wyslalem jest juz ktoryms z kolei, bo co tutorial, to cos sie nieco zmienia) najwiecej niewiadomych jest w samym otwieraniu pliku bmp, bo w tutorialach uzywaja funkcji loadBMP, o ktorej u mnie pisze, ze not deklared:/ albo tej z biblioteki glaux... jesli ktos pracuje w opengl+qt i radzi sobie z teksturami, bylbym wdzieczny za jakis przyklad prosty do nauki, dzieki |
|
SeaMonster131 |
» 2010-10-24 09:49:45 [...]narysowane obiekty pokryte sa kolorem, bez tekstur[...] |
Na OpenGL sie nie znam. Ale może te obiekty nie mają UV Co-ordinates? |
|
VND |
» 2010-10-24 13:40:53 @SeaMonster131 glTexCoord2f to właśnie UV.
Trzeci parametr glTexImage2D to ilość kolorów składowych bitmapy. Masz tam 0 a powinno być 3 ==> (GL_RGB). Jeśli masz bmp z kanałem alpha to 4 i GL_RGBA.
Funkcję tekstury(); wykonaj tylko raz, później glBindTexture załatwia sprawę, jeśli chcesz przełączać się między różnymi texturami. glDisable( GL_TEXTURE_1D ); jest niepotrzebne. |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-10-24 17:51:57 parametr nr 3 poprawilem (bylo 0, bo w miedzyczasie duzo podobnych funkcji uzywalem, jedna z nich miala w tym miejscu grubosc ramki wokol obrazka - wiec przez pomylke bylo 0,jest juz 3),
disable 1D czesto bylo w roznych tutorialach uzyte razem z enable 2D, dlatego tez dalem (juz usunalem),
funkcje textury(); wrzucilem w initializeGL() - wiec wykona sie tylko raz, pozniej przez gl BindTexture - tak jak napisales.
jednak wciaz nie dziala, zastanawiam sie, czy np ostatni parametr podaje dobrze? bo byc moze, musze jakos przeksztalcic format QImage? moge np wyciagnac z QImage kolor RGB dla kazdego pixela i zapisac w tablicy, a pozniej ta tablice podac jako ostatni parametr? bo gdzies widzialem podobne rozwiazanie (ale czy u mnie to bedzie potrzebne...?) |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-10-24 20:57:42 problem rozwiazany :):) po pierwsze - trzeba uzyc funkcji z Qt - convertToGLformat(); QImage t; QImage b;
if( !b.load( "1.bmp" ) ) { b = QImage( 16, 16, QImage::Format_ARGB32 ); b.fill( 200 ); }
t = QGLWidget::convertToGLFormat( b ); glGenTextures( 1, & tab1 ); glBindTexture( GL_TEXTURE_2D, tab1 ); glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
|
« 1 » |