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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

06.10.2010, 12:06

Ist klar, wenn du ihn zuletzt ohne Tiefen-Pufferung schreibst, dann muss er ja alles überschreiben. Wie soll's denn sonst auch gehen? Woher soll er die Tiefen-Werte kennen, wenn du sie deaktivierst? Auch bei aktivem Z-Buffer wirst du unabhängig von der Reihenfolge natürlich die gleichen Überschreibungen bekommen, egal ob du ihn zuerst oder zuletzt renderst. Da sind deine Z-Werte wohl eindeutig hinter deinem Background-Quad.

Auch das mit dem 'auf dem Kopf' ist leich geklärt, wenn du dir das Koordinaten-System noch mal vor Augen führst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

n0_0ne

1x Contest-Sieger

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

12

06.10.2010, 12:17

ich habe sicherheitshalber direkt darüber den depthtest nochmal angeschaltet und mit glGet überprüft, ob depthmask auch wirklich ausgeschaltet ist. Scheint soweit alles in ordnung zu sein. Dass der Ursprung der texturkoords oben links ist, habe ich nicht übersehen, ich gebe auch alles gegen den uhrzeigersinn an (obenlinks, untenlinks, untenrechts, obenrechts, falls du es netterweise nachprüfen willst :D) und wenn du mit t-achse die y achse meinst, dann hab ich auch das nicht vergessen. Allerdings hab ich beim glOrtho aufruf im prinzip oben=0 und unten=1 gesetzt, damit die texturkoordinaten mit den vertexkoordinaten übereinstimmen.

Weil ich mir nicht sicher war, ob das auch wirklich "oben und unten" vertauscht, habe ich es nochmal komplett ohne glOrtho gemacht, also als projektion eine reine identitätsmatrix genommen, und dann nochmal mit diesen koordinaten versucht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
glTexCoord2i(0, 0);
glVertex3i(-1, 1, -1);
glTexCoord2i(0, 1);
glVertex3i(-1, -1, -1);
glTexCoord2i(1, 1);
glVertex3i(1, -1, -1);
glTexCoord2i(1, 0);
glVertex3i(1, 1, -1);


gleiches ergebnis, das bild steht auf dem kopf

n0_0ne

1x Contest-Sieger

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

13

06.10.2010, 12:24

Ist klar, wenn du ihn zuletzt ohne Tiefen-Pufferung schreibst, dann muss er ja alles überschreiben. Wie soll's denn sonst auch gehen? Woher soll er die Tiefen-Werte kennen, wenn du sie deaktivierst? Auch bei aktivem Z-Buffer wirst du unabhängig von der Reihenfolge natürlich die gleichen Überschreibungen bekommen, egal ob du ihn zuerst oder zuletzt renderst. Da sind deine Z-Werte wohl eindeutig hinter deinem Background-Quad.

Auch das mit dem 'auf dem Kopf' ist leich geklärt, wenn du dir das Koordinaten-System noch mal vor Augen führst.
sry wegen dem doppelpost...
@BlueCobold: ja, ist logisch, dass wenn z-buffering komplett aus ist, der hintergrund alles übermalt, wenn er zuletzt gerendert wird. ich wollte auch garnicht sagen, dass das verhalten komisch ist. was ich nicht verstehe ist: warum sollte er denn auch bei aktivem z-buffer, wenn ich die weitest-mögliche entfernung angebe, irgendwas übermalen? das ergibt keinen sinn.

Und ich habe mir jetzt mehrfach das koordinatensystem vor augen geführt und es auf verschiedene arten versucht (wie in meinem vorigen post beschrieben) aber ich komme immer wieder zum selben ergebnis. Das bild steht auf dem kopf, irgendwas hab ich wohl falsch verstanden und wenn es für dich so offensichtlich ist, wäre ich dankbar, wenn du mich darauf hinweisen könntest ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

06.10.2010, 12:45

-1 ist die näheste z-Koordinate und nicht die am weitesten entfernte wenn du keine entsprechende Projektionsmatrix verwendest die die z-Achse umdreht. Versuchs mal so (alle Matritzen auf Identity):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);

Schau dass du den Depth Buffer in jedem Frame mit glClear() löscht, zeichne den Hintergrund zum Schluss und auch wenn es mit den Koordinaten nun funktionieren mag würde ich trotzdem nicht in den Depth Buffer schreiben weil das nur unnötig verbratene Bandbreite wäre. Falls du vorhattest mit dem Rendern des Hintergrundes gleichzeitig den Depth Buffer zu löschen lass das lieber. Das ist ein sehr (zu) alter Trick der heutzutage nichtsmehr nützt, im Gegenteil sogar: Ohne glClear() muss die Grafikkarte auf einige sehr wichtige Optimierungen (Early Depth Test und Z-Cull) verzichten.

EDIT: Musste die Koordinaten korrigieren, ständiges Hin und Her zwischen OGL und D3D verwirrt mich manchmal...

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (06.10.2010, 13:02)


n0_0ne

1x Contest-Sieger

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

15

06.10.2010, 13:09

http://www.c-plusplus.de/forum/viewtopic…-is-267084.html

Das war wohl mein denkfehler bezüglich des werts für die tiefenangabe. (deckt sich auch mit dem was zu gesagt hast). Erklärt aber nicht das Kopfstehen der textur.

Wenn ich überall Identity matrizen habe, funktionieren deine koordinaten leider nicht, der hintergrund bleibt schwarz.

Aber wie kommst du denn auf die koordinaten?
beispielsweise der erste punkt: die texturkoordinaten (0, 1) sollten links unten sein
(-1, 1, 1) sollte doch dann aber links oben sein, oder? wenn die y-achse nach oben zeigt

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

06.10.2010, 14:29

[...] beispielsweise der erste punkt: die texturkoordinaten (0, 1) sollten links unten sein [...]

nope, (0, 1) ist links oben. Wie schon gesagt liegt der Ursprung des Texturkoordinatensystems in OpenGL links unten (t bzw. v Achse ist genau verkehrt herum wie bei D3D).

n0_0ne

1x Contest-Sieger

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

17

06.10.2010, 14:45

oh, dann hatte ich es in deinem post falsch gelesen, und du dann danach wohl auch in meinem ^^
Dummerweise hatte ich die t-achse ja auch als die y-achse verstanden, da ich nicht wußte, dass man sie bei den texturen t und v nennt ^^

Ich denke damit müsste alles geklärt sein und ich endlich meinen Hintergrund richtig malen können :) Danke für eure Hilfe (vor allem @dot)

Nachtrag: Es funktioniert, einzige weitere Änderung: glDepthFunc(GL_LEQUAL); damit der hintergrund gegen den bereits initialisierten am weitesten entfernten wert "gewinnt"
Der vollständigkeit wegen hier der funktionierende code:

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

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();

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

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glDepthMask(GL_FALSE);
    glDisable(GL_LIGHTING);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 1000);

    glBegin(GL_QUADS);
    // top, left
    glTexCoord2i(0, 1);
    glVertex3i(-1, 1, 1);
    // bottom, left
    glTexCoord2i(0, 0);
    glVertex3i(-1, -1, 1);
    // bottom, right
    glTexCoord2i(1, 0);
    glVertex3i(1, -1, 1);
    // top, right
    glTexCoord2i(1, 1);
    glVertex3i(1, 1, 1);
    glEnd();

    glDepthMask(GL_TRUE);
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_LIGHTING);

    glPopMatrix();
    glMatrixMode(GL_PROJECTION);

    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);

    glPopMatrix();

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


Werbeanzeige