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

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

1

05.10.2010, 22:52

Hintergrundbild mit OpenGL

Hi,

Ich versuche zur Zeit mir eine kleine Funktion zu schreiben die mir zu jeder Zeit einen Hintergrund rendern kann (das bedeutet ich will den z-buffer verwenden und nicht einfach komplett drüberrendern).

Ich dachte eigentlich, dass ich soweit verstanden hätte, wie es funktioniert, aber anscheinend ist das doch nicht der Fall. Was ich ich versucht habe:
Ich pushe alle Matrix-Stacks und lade die Identitätsmatrix, bei Projektion erzeug ich eine Matrix für parallelprojektion. Dann male ich ein Quad welches den ganzen bildschirm füllen sollte, mit passenden textur-koordinaten. Hier mein Code bis jetzt:

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
glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glOrtho(0, 1, 1, 0, 1, -1);

    glMatrixMode(GL_TEXTURE);
    glPushMatrix();
    glLoadIdentity();

    glDisable(GL_LIGHTING);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 1000);

    glBegin(GL_QUADS);
    glVertex3i(0, 0, -1);
//  glNormal3i(0, 0, 1);
    glTexCoord2i(0, 0);
    glVertex3i(0, 1, -1);
//  glNormal3i(0, 0, 1);
    glTexCoord2i(0, 1);
    glVertex3i(1, 1, -1);
//  glNormal3i(0, 0, 1);
    glTexCoord2i(1, 1);
    glVertex3i(1, 0, -1);
//  glNormal3i(0, 0, 1);
    glTexCoord2i(1, 0);
    glEnd();

    glDisable(GL_TEXTURE_2D);
    glEnable(GL_LIGHTING);

    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();


Irgendwo muss ich hier einen Denkfehler haben, denn die Textur scheint um 90° gedreht und Spiegelverkehrt zu sein. Außerdem gibt es Probleme wenn ich andere Objekte mit ins Spiel bringe, diese werden nicht gerendert (wenn ich den z-buffer ausschalte während ich den background rendere schon). Außerdem scheinen sich dann auch die texturkoordinaten zu verändern, denn das hintergrundbild wird dann total verzerrt und falsch dargestellt. Dadurch, dass ich überall den Matrixstack pushe und "resette" dürften andere gerenderte objekte doch eigentlich garkeine auswirkung hierauf haben. Kann mir jemand sagen, was hier schief läuft? Wäre sehr dankbar ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

06.10.2010, 00:47

Du musst glTexCoord vor dem entsprechenden glVertex aufrufen. Und deinen Hintergrund solltest du natürlich nicht in den z-Buffer schreiben, schalt also die glDepthMask aus.

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

3

06.10.2010, 08:06

Ahhhhhh, das erklärt das merkwürdige verhalten :thumbsup: Warum bin ich darauf nicht gekommen...
Und was den Z-Buffer angeht: meinem glOrhto aufruf nach, sollte -1 doch der am weitesten entfernte z wert sein, warum reicht es dann nicht, dass ich einfach den als position für den hintergrund nehme, und den z-buffer ganz normal funktionieren lasse?

botlin

Treue Seele

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

4

06.10.2010, 08:20

Angenommen du willst die Funktion später in einem anderen Projekt verwenden welches aber ganz andere Einstellungen hat was den Z-Buffer betrifft. Dann wäre deine jetzige Annahme das der Z Buffer -1 als Tiefenwert besitzt für die Katz.
Ich würde es so machen das ich den Tiefenpuffer ausschalte dann das Bild rendere und dann den Z Buffer anschalte und dann alle anderen Objekte die du den so zeichnen möchtest. Wichtig ist das du den Background als erstes zeichnest, da sonst alte Inhalte verloren gehen können.

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

5

06.10.2010, 09:01

Naja, wie gesagt würde ich den Hintergrund gerne zu jedem Zeitpunkt zeichnen können. Außerdem legt die funktion doch selbst fest, dass -1 am weitesten entfernt ist, oder versteh ich hier was falsch?

Nachtrag: im Prinzip hat dot ja schon gesagt, wie es geht, also einfach den z-buffer schreibgeschützt machen mit glDepthMask, aber ich würde schon gerne verstehen, warum es nicht so funktioniert, wie ich es mache. :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »n0_0ne« (06.10.2010, 09:13)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

06.10.2010, 10:37

Noch eine Frage: warum verwendest du als Textur-ID einfach 1000?
Normalerweise fordert man doch mit glGenTextures neue IDs an.

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

7

06.10.2010, 11:03

oh naja, das liegt daran, dass ich zur Zeit alles nur sehr "prototypisch" mache, also einfach mal alles mögliche versuche zu implementieren. Einfach nur um zu sehen, ob es funktioniert. Für alles was mit texturen zusammenhängt lade ich an einer stelle einfach immer nur eine textur, die ich dann für alles verwende, damit ich nicht überall wissen muss, welche nummer diese textur jetzt hat, benutze ich einfach überall fest die zahl 1000 ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

06.10.2010, 11:11

[...] aber ich würde schon gerne verstehen, warum es nicht so funktioniert, wie ich es mache. :)

Wie hast du es denn gemacht?

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

9

06.10.2010, 11:29

öhm, das steht doch oben in meinem ersten Post ^^

ich gebe bei der projektion in glOrtho als far-wert -1 an, und diesen wert benutze ich dann auch für das quad des hintergrunds, aber trotzdem verdeckt der hintergrund andere objekte, wenn ich den z-buffer komplett ausschalte (und damit auch das schreiben des z-buffers) und den hintergrund als erstes zeichne, werden die anderen nicht mehr verdeckt.

Edit: Also ich habe es jetzt einmal nach dots hinweisen geändert, also die texcoord aufrufe über die vertexaufrufe verschoben und vorher glDepthMask deaktiviert und dann wieder aktiviert. Trotzdem funktioniert es nicht wirklich, das Hintergrundbild steht auf dem kopf und der tiefenbuffer scheint immer noch geschrieben zu werden, wenn ich nämlich den background als letztes rendern lasse, überschreibt er immer noch alles. :/

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »n0_0ne« (06.10.2010, 11:51)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

06.10.2010, 12:05

Schaltest du wirklich nur die DepthMask oder den Depth Test auch ab (mit glDisable)? Der DepthTest muss nämlich auf jeden Fall an bleiben. Ich hab mir ehrlich gesagt deine Zahlen nicht genau durchüberlegt aber wenn das Bild am Kopf steht würde ich mal vermuten du hast übersehen dass der Ursprung der Texturkoordinaten in OpenGL links unten ist und die t Achse nach oben zeigt (bei Direct3D is das anders rum).

Werbeanzeige