Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenGL] + [Qt] problem z wczytywaniem tekstur

Ostatnio zmodyfikowano 2010-10-24 20:57
Autor Wiadomość
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

C/C++
void GLWidget::tekstury()
{
    QPixmap p;
    QString l = "1.bmp";
    p.load( l );
    glGenTextures( 1, & tab1 ); //GLuint 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 );
}

// pozniej w paintGL()

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
P-23220
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?
P-23222
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.
P-23229
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...?)
P-23271
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();

C/C++
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 );


P-23295
« 1 »
  Strona 1 z 1