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

1

30.05.2008, 08:38

OpenGL: Z-Wert unabhängig von der tatsächlichen Position

Servus,

wollte mal fragen ob es möglich ist, unter OpenGL ein Polygon zu setzen, aber dessen Z-Wert nachträglich noch zu verändern.

Zwar glaube ich mich zu erinnern, daß das tatsächlich möglich ist (ist schon 'ne Weile her), aber nur, indem man direkt den absoluten Z-Wert setzt. Ich würde dagegen lieber eine Position setzen, also so, als hätte ich das Polygon eigentlich an eine andere Stelle gezeichnet.

Ist so etwas möglich?



EDIT: Nur zur Sicherheit: Es ist natürlich der Z-Wert für den Depth-Test gemeint

2

30.05.2008, 10:24

Ja, indem du das Polygon gleich an eine andere Stelle setzt. Pixelshader koennten as auch.

Was willst du ueberhaupt damit erreichen?

3

30.05.2008, 10:57

Ich will eine isometrische Ansicht erzeugen, dazu wird die Welt hauptsächlich aus Würfeln aufgebaut. Einzelne Objekte (wie z.B. ein Baum oder ein Männchen) sollen jedoch als 2D-Sprite auf ein einzelnes Rechteck gezeichnet werden, welches diagonal auf den Würfeln steht (sodaß es letztendlich zur Kamera zugewandt ist).

Die Z-Werte wären dann absolut perfekt, das Problem ist nur, daß die untere Kante dann eben in der Mitte der oberen Würfelfläche ist (----):

Quellcode

1
2
3
4
5
 /\
/  \
----
\  /
 \/


Somit können z.B. Füße einer Person nicht korrekt dargestellt werden, denn richtig wäre eigentlich eher so etwas:

Quellcode

1
2
3
4
5
 /\
/  \
\  /
 \/
----


Somit wäre genug Platz für die Füße. Nun steht die Fläche allerdings nicht mehr an der richtigen Stelle, womit auch der Z-Wert nicht mehr paßt. Rein optisch würde es aber korrekt gerendert werden, sofern man die Z-Position nachträglich wieder ein Stück nach hinten verschieben könnte, sodaß die "virtuelle Kante" wieder exakt diagonal auf der Würfelfläche liegen würde.

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

4

31.05.2008, 10:27

Versteh' ich zwar nicht so ganz, wieso du das so machen willst - aber du kannst ja einfach vorm Rendern der Objekte den Tiefentest ausschalten:

Quellcode

1
2
3
4
5
    glDisable(GL_DEPTH_TEST);

        //Objekte Rendern

    glEnable(GL_DEPTH_TEST);


Das bewirkt, dass die Objekte einfach gerendert werden, ohne das überprüft wird, ob andere Pixel vielleicht davor liegen. Allerdings werden dann auch die entsprechenden Tiefenwerte der gezeichneten Pixel nicht abgespeichert. Du müsstest dann die Objekte in der richtigen Reihenfolge rendern, damit sie sich trotzdem richtig überlagern.

Ansonsten, den Tiefenwert eines Polygons kannst du nachträglich nicht ändern, da dieser Pixelweise abgespeichert wird und somit nicht mehr als zusammenhängendes Objekt behandelbar ist.

5

01.06.2008, 15:04

Naja den Test komplett abzuschalten halte ich auch nicht für so gut :)

Also ich hab mal noch eine Skizze gezeichnet, um zu zeigen, worauf ich hinaus will:

(Link)


Die gesamte 3D-Welt soll also isometrisch gerendert werden. Der Boden besteht aus Würfeln (oder im Bild halt aus Flächen, kommt aber selbstverständlich aufs gleiche raus). Figuren sollen ganz normale 2D-Sprites sein, die einfach wie ein Billboard als Fläche gerendert werden. Dadurch daß die Fläche (roter Rand) exakt diagonal auf einem Würfel steht, ist auch der Z-Wert immer perfekt (stellt euch vor, auf dem gelben Feld würde ein weiterer Würfel, sprich, eine Wand stehen).

Nun ist es aber so, daß dann die Füße eines Sprites nicht mehr ganz draufpassen würden. Aus diesem Grund bräuchte ich den Platz, den mir der blaue Rand bietet. Daher könnte ich das Polygon einfach ein Stück weiter vorne rendern, also nicht diagonal auf dem Würfel sondern vorne am Eck des Würfels. Nur wäre jetzt der Z-Wert nicht mehr korrekt. In vielen Fällen würde es vielleicht nicht zu Grafikfehlern kommen, aber je nachdem wie die Figur sich umherbewegt gibt es sicherlich ein paar Situationen, wo die Sortierung einfach nicht mehr dem entspricht, wie sie eigentlich sein sollte.

Und aus diesem Grund hatte ich eben nach einer Möglichkeit gesucht, das Poly einfach vorne zu zeichnen, aber was den Z-Wert angeht irgendwie so zu tun als hätte ich es dort gezeichnet, wo das rote Poly zu sehen ist, indem ich eben den Z-Wert nachträglich wieder verändere.



Das war mein Anliegen. Jetzt hat mir allerdings jemand eine andere coole Lösung vorgeschlagen, und diese sieht so aus:

(Link)


Hier wird also ein kompletter Würfel gezeichnet und die Textur-Koordinaten werden so gesetzt, daß es immer noch paßt. Höchstwahrscheinlich werde ich dann darauf zurückgreifen, weil es weniger Rumgetrickse ist als wenn ich den Z-Wert irgendwie verändern würde... aber wenn's dafür doch 'ne gute Lösung gibt, dann würde mich das natürlich nach wie vor interessieren :)

6

01.06.2008, 15:25

Du machst dir das Leben sehr schwer ...

Also einfach den Untergrund zeichenen, Tiefentest ausschalten und dann deine Figuren als Billboard zeichnen. Tiefentest anschalten. Das ist natuerlich nicht die einzig moegliche Loesung, aber recht einfach.

Warum soll das abschalten des Tiefentest nicht gut sein ?

7

01.06.2008, 15:52

Naja dann muß ich ja wieder drauf achten, alles in der richtigen Reihenfolge zu zeichnen.

Hast Du schonmal Iso programmiert (in 2D)? Es ist Wahnsinn, wie krass Du beim Sortieren aufpassen mußt. Da treten extrem viele Nebeneffekte auf, an die man anfangs niemals denken würde. Und daß ich es nun mit 3D statt 2D machen will, ist eigentlich eher ein Schritt in die "einfachere" Richtung, denn nun brauch ich mich um die Sortierung eigentlich kein Stück mehr zu kümmern.

Wenn ich nun aber erst den "Untergrund" zeichne (da ist schon das 1. Problem: was ist der Untergrund?), dann eine Figur draufsetze ohne Z-Test, dann würde die Figur z.B. über die Mauer gezeichnet werden, die auf dem gelben Feld stehen könnte. Daher muß ich zwangsläufig alles in der richtigen Reihenfolge zeichnen, und genau aus diesem Grund will ich ja eigentlich alles per Z-Test machen.

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

8

01.06.2008, 16:13

Also entweder, du machst den Tiefentest aus und renderst in richtiger Reihenfolge, oder du setzt das 2D-Sprite auf die Position des unteren Vertex des Feldes, oder du machst einfach gleich ein richtigtes 3D-Spiel - Letzteres hat mir bei einem Strategiespiel auch schon jede Menge Ärger erspart.

Und die Möglichkeit, die man dir da gezeigt hat, ist ja auch nicht schlecht, aber dann würde die Figur auch über alles drüber gezeichnet werden, was noch auf dem Feld ist.

9

01.06.2008, 16:33

Es gibt keine ultimative Loesung, auch in deinem Vorschlag sind ... pitfalls ... Du kannst ja jede Ebene extra rendern. Aslo erst den Untergrund mit Tiefentest, also Ebene1, dann alles, was auf Ebene1 steht, nur ohne Tiefentest. Mauern sind dann z.B. eine Ebene hoeher. Und hast du hohe Mauern, so zeichne nur den entsprechenden Teil der Mauer, der zur Ebene gehoert. usw.

Zitat

Es ist Wahnsinn, wie krass Du beim Sortieren aufpassen mußt. Da treten extrem viele Nebeneffekte auf, an die man anfangs niemals denken würde.

Hmm, Sortieren ist recht einfach, um Nebeneffekte zu vermeiden wuerde ich ein stable_sort nehmen. Natuerlich wuerde ich mich nur auf Objekte beschraenken, die sich verandert haben.

Zitat

Und daß ich es nun mit 3D statt 2D machen will, ist eigentlich eher ein Schritt in die "einfachere" Richtung, denn nun brauch ich mich um die Sortierung eigentlich kein Stück mehr zu kümmern.


Anscheinend musst du dich doch drum kuemmern.

10

01.06.2008, 16:56

Also ich habe bereits eine 2D-Iso-Engine angefangen und da war die Sortierung wirklich nicht leicht. Die meisten Iso-Engines benutzen allerdings eher flache Levels, also ein Boden, ein paar Wände, und ein paar Figuren. Meine Levels sollen aber so dreidimensional wie möglich sein, es soll z.B. auch Brücken geben usw., und da wird die Sortierung leider ein bißchen komplizierter. Kann man aber wie gesagt nur dann nachvollziehen wenn man's selbst tatsächlich mal gemacht hat, denn auf den ersten Blick sieht Iso ziemlich simpel und unkompliziert aus.

Zudem bewegen sich meine Figuren komplett frei in der Welt, es gibt also keine "Ebenen" in dem Sinne. Daher ist es nicht möglich, Ebene für Ebene zu zeichnen, weil jedes Element auch mal nur auf "halber Höhe" oder so sein kann.


@ Powerpaule: Naja wenn die Textur in der "Würfel-Methode" auch 'nen Alpha-Kanal besitzt würde der Boden ja trotz allem durchscheinen. Und mehrere Figuren pro Feld ist eh nicht möglich, da sowas durch die Kollisionsabfrage abgefangen würde.

oder du setzt das 2D-Sprite auf die Position des unteren Vertex des Feldes - das wäre die Möglichkeit mit dem blauen Rahmen. Ich denke daß es in vielen Situationen richtig aussieht, aber ich könnte mir (aufgrund meiner bisherigen Iso-Erfahrungen) sehr gut vorstellen, daß auch hier wieder Grafikfehler auftreten können (unter bestimmten Umständen).

Komplett 3D ist natürlich auch 'ne Möglichkeit, aber erstens bin ich nicht besonders gut im 3D-Modelle bauen und zweitens will ich eigentlich schon aus rein ästhetischen Gründen 2D-Sprites verwenden.


Naja mal schauen, bin mit der neuen Engine noch relativ am Anfang, ich werd jetzt erstmal dafür sorgen daß die eigentliche Welt gerendert werden kann, und dann probier ich einfach mal ein bißchen rum. Möglicherweise ist die Idee mit dem blauen Rahmen ja doch ausreichend.

Werbeanzeige