Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ArthurII

Treue Seele

  • »ArthurII« ist der Autor dieses Themas

Beiträge: 132

Wohnort: Aachen

Beruf: Student

  • Private Nachricht senden

1

20.01.2011, 20:50

[Qt][OpenGL] Texturierung

Nabend,
habe vor kurzem zusammen mit 2 Kollegen mit einem neuen Projekt angefangen. Beim alten hatte ich mitten in einer Debugfase aufgehört sodass ich da jetzt nicht mehr reinkomme und weiß wo die Porbleme lagen...

Nun habe ich folgendes Problem:

Die Texturierung möchte einfach nicht. Ich habe schon diverse Tutorials durchwühlt, dazu noch meinen alten Code und den Code von einem Kumpel kann aber ncihts finden, was mir fehlen könnte. Was sind so die wichtigsten Dinge die ich Anhaben muss, damit es funktioniert.

hier einfach mal unsere initGL-funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Game::initializeGL(){
    //Texturen anschalten
    glEnable(GL_TEXTURE_2D);

    //schönere Farbübergänge auf Körpern
    glShadeModel(GL_SMOOTH);
    
    //Antialasing aktivieren
    glEnable(GL_LINE_SMOOTH);

    //schwarzer Hintergrund
    glClearColor(0,0,0,0);

    //depth buffer zurücksetzen
    glClearDepth(1.0);
    
    //Typ des Depth-Test
    glDepthFunc(GL_LEQUAL);

    //tiefen-test aktiv
    glEnable(GL_DEPTH_TEST);
    
    //festlegen der Perspektive
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}


das zeichnen läuft dann so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
double z=-50;
double c=0.0;
int mv=0; //bewegungsvar für testcubes

void Game::paintGL(){
    Vector move_c(0,0,-0.005); //bewegungsvektor für testcube
    for (int i=0;i<mv;i++)
        move_c[2]-=0.005;

    //Puffer lehren
    glClear(GL_COLOR_BUFFER_BIT |  GL_DEPTH_BUFFER_BIT);
    
    //einheitsmatrix setzen
    glLoadIdentity();
    

    //Kamera passen drehen
    glRotated(main_player.get_camera_angle()[0], 1,0,0);
    glRotated(main_player.get_camera_angle()[1], 0,1,0);
    glRotated(main_player.get_camera_angle()[2], 0,0,1);

    //Kamera passen setzen
    glTranslated(-main_player.get_position()[0], -main_player.get_position()[1], -main_player.get_position()[2]);
    
    glColor4d(1,1,1,1);
    GLuint tex =  **textures.begin();
    
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
                    GL_REPLACE); //GL_REPLACE or GL_MODULATE



    glBindTexture(GL_TEXTURE_2D, tex);
    
    glBegin(GL_QUADS);
     glTexCoord2f(0,0); glVertex3f(-1,1,z);  //lo
      glTexCoord2f(0,1); glVertex3f(-1,-1,z); //lu
      glTexCoord2f(1,1); glVertex3f(1,-1,z);  //ru
      glTexCoord2f(1,0); glVertex3f(1,1,z);   //ro
    
        glColor3d(1,1,1);glVertex3d(-20,-1,20);
        glColor3d(1,0,0);glVertex3d(-20,-1,-20);
        glColor3d(0,1,0);glVertex3d(20,-1,-20);
        glColor3d(0,0,1);glVertex3d(20,-1,20);
    glEnd();

    z+= 0.01;
    c+=0.25;
    mv++;

    
    glFlush();
}


Wir nutzen Qt für das Fenstermanagment.


Wenn ihr noch mehr infos braucht, kein Thema...

thx

Arthur
Ich bin nicht verrückt - nur verhaltensoriginell!
Project-Seite: Aura

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

20.01.2011, 20:54

Was genau funktioniert nicht? Wofür is das glTexEnv() da drin? Wie und wo ladest du deine Textur? Lauft alles ohne Fehler ab (Returnwerte und glGetError() gecheckt)? Ein gängiger Fehler in OpenGL ist es zu vergessen die Texturfilter mit glTexParameteri() zu setzen, ohne geht nix.

ArthurII

Treue Seele

  • »ArthurII« ist der Autor dieses Themas

Beiträge: 132

Wohnort: Aachen

Beruf: Student

  • Private Nachricht senden

3

20.01.2011, 21:21

das glTexEnv war n test, dass hatte ich iwo gesehen und einfahc mal kopiert...


Ich lade die Textur so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
GLuint* Parser::loadGLTexture(string dir)
{
    QImage t;
    QImage temp;
    QImage b;

    GLuint* texture = new GLuint;

    if ( !b.load(dir.c_str()) )
    {
        b = QImage( 16, 16, QImage::Format_ARGB32 );
        b.fill(0);
        cout << "burn\n";
    }


    if (b.format() == QImage::Format_ARGB32)
        temp = b; //korrektes Format einstellen
    else
        temp = b.convertToFormat(QImage::Format_ARGB32);

    t = QGLWidget::convertToGLFormat(temp);

    glGenTextures( 1, texture);
    glBindTexture( GL_TEXTURE_2D, *texture);


    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    glTexImage2D( GL_PROXY_TEXTURE_2D, 0, GL_RGBA, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );

    return texture;
}



ich weiß, dass der Umweg über temp nicht notwendig wäre, aber auch das ist ein Testrest...

ausgabe "burn" kommt nur, wenn texturpfad falsch ist...
Ich bin nicht verrückt - nur verhaltensoriginell!
Project-Seite: Aura

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

20.01.2011, 21:26

Warum verwendest du da das GL_PROXY_TEXTURE_2D target!?

ArthurII

Treue Seele

  • »ArthurII« ist der Autor dieses Themas

Beiträge: 132

Wohnort: Aachen

Beruf: Student

  • Private Nachricht senden

5

21.01.2011, 15:54

das ist da anscheinend fehl am Platz. ändert aber nichts an am Nicht-Funktionieren. Der Kollege hat anscheinend mip-mapping verwendent. Das muss aus dessen Code sein...

habe gerade auch mal das glGetError überprüft. Nichts.

Die ausgabe von t.bits() auf der Konsole gibt allerdings ne ganze reihe von nicht dekodierbaren zeichen. Da steht also was drin.

der return von LoadGLTexture funktioniert auch
Ich bin nicht verrückt - nur verhaltensoriginell!
Project-Seite: Aura

ArthurII

Treue Seele

  • »ArthurII« ist der Autor dieses Themas

Beiträge: 132

Wohnort: Aachen

Beruf: Student

  • Private Nachricht senden

6

21.01.2011, 19:15

ich habs gelöst!!

das Problem ist: man muss das laden der Texturen in der initialziGL Funktion machen.

habs in diesem Tutorial gefunden:

Zitat

In example 14-6, the code for loading images and binding them to textures is shown. Notice that the QImage class has support for an OpenGL friendly format. The loadGLTextures method is called from the initializeGL method.


Trotzdem danke für die Mühen!

hf

Arthur
Ich bin nicht verrückt - nur verhaltensoriginell!
Project-Seite: Aura

Werbeanzeige