transparente Objekte in Landschaft (OGL).... wie jetzt?
-
hi leute,
ich ahb mir vor kurzen mal etwas bescheidenes zur Darstellung von Terrain gebastelt. Nun woltle ich auch ganz simple Bäume draufsetzen (werden nach der Landschaft gerendert). Dafür kreuz ich einfach zwei Quads mit ner Baumtextur. Damit das um den Baum transparent wird nehm ich blending. Nur dann seh ich die andere Baumtextur nicht mehr (auf jeden Fall dort, wo die erste Textur davor ist)
Ok, da hab ich mir gedacht, schalte ich den Depthbuffer aus. Jetzt funzt das mit den Bäumen, aber ich sehe sie dummerweise auch, wenn sie hinter den Hügeln meiner Landschaft sind. Ist ja eigentlich auch logisch.
Leider weiß ich jetzt nicht mehr weiter...Ich hoffe hier kann mir einer weiterhelfen, thx
-
Hast du mit dem Dephtbuffer auch an die Sortierung gedacht?
Also erst Terrain, dann DepthBuffer off, dann Bäume von Hinten nach vorne, dann Depth Buffer wieder on
-
Ne, sortiert hab ich erst mal gar nichts. ich versteh auch nicht, was das bringen soll.
Die Bäume sind doch auch sortiert hinter den Hügeln des Terrains sichtbar. Oder versteh ich etwas falsch?
-
Vielleicht läßt sich da mit Alphatest was machen.
-
Inwiefern? Es ist ja eigentlich egal, wie ich dei Masking Technick realisiere. Der DepthBuffer muss trotzdem aus, damit man hinter den unsichtabren Teilen der Textur was sieht.
-
Was ist so schlimm daran, das man den Baum auch hinter einem Hügel sieht ?
Oder sieht man den Baum durch den Hügel ? Das wäre wiederrum sehr bemerkenswert und liegt wohl daran, das du das Alpha-Blending auf alles anwendest und nicht nur auf die Bäumchen.
-
Also, man sieht die Bäume durch die Hügel. Das liegt ja ach daran, dass der Depth Test DEAKTIVIERT ist. Das heißt, OPENGL schaut nicht nach, ob der Baum vom Hügel verdeckt ist. Das Terrain wird korrekt ohne Blending gezeichnet.
Ich hoffe ihr versteht mich jetzt endlich. Ich muss halt beim Zeichnen der Bäume, den Depth Test deaktivieren, weil man sonst die Sachen hinter den transparenten Flächen nicht mehr sieht.
Aber wie gesagt, dann gibt es halt das Problem, dass ich die Bäume durch den Hügel sehe.
-
Dein Problem ist, das du die Polys in der falschen Reihenfolge renderst.
Das wäre normalerweise kaum ein Problem - Aber da du Blending benutzt, kann das komische Nebeneffekte haben. Du renderst anscheinend erst den Hügel und dann den Baum - Obwohl der Baum sich hinter dem Hügel befindet.
Du solltest die Szenerie aber von hinten nach vorne rendern (Das weit entfernteste zuerst usw).
Dann musst du noch beachten:
Malst du einen Baum ? -> Depth Testing aus
Malst du die Hügel -> DT ein
-
Das hört sich zwar vernünftig an, aber normal ist das terrain rendern doch eine (zum Teil sehr komplexe) Einheit. Ich kenne keinen Algorithmus zum Rendern von Terrain, wo auch noch auf so etwas geachtet wird. Die zeichnen ja oft kreuz und quer.
Wenn man da noch etwas implementieren will, dass das Terrain mit irgendwelchen Bäumen abgleicht steht man doch vor einer ziemlich schweren Aufgabe..
-
Also sinnvollerweise rendert man das Terrain normal und dann alle Bäume von hinten nach vorn mit z-write disabled.
-
Was ist denn z-write
-
Depth Write - nur unter DX
-
Kannst du das mal mit Depth-Write erklären.
Meinst du, das man nur in den Depth-Buffer schreibt,
oder das man Depthtesting abschaltet.Beides wird nämlich von Gl unterstützt.
-
Nein - Depthwrite disabled. So daß er nur lesen, aber nicht schreiben kann.
-
Original erstellt von SnorreDev:
Nein - Depthwrite disabled. So daß er nur lesen, aber nicht schreiben kann.Sag ich doch
-
Stimmt, mit
glDepthMask(False);
kommt man schon weiter. Sieht jetzt perfekt in der landschaft aus. Sieht nur Mist aus, wenn man zB zwei Bäume hintereinander hat, dann wird die Textur plötzlich auch da transparent, wo sie eigentlich nicht transparent sein sollte (also der baum an sich).
Ich benutze übrigens die masking Methode ausm nehe Tut http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=20.
-
Das geht auch mit Gl
glDepthMask(GL_FALSE);//writing disabled
glDepthMask(GL_TRUE);//gegenteil
-
Das geht auch mit int
glDepthMask(0);//writing disabled
glDepthMask(1);//gegenteil
-
ok, jetzt funzt alles, thx für jede Hilfe(-bemühung)
Nur anscheinend haben die Delphi leute mehr drauf , da wurde das mit dem glDepthMask(XXX) sofort erwähnt...
-
Verdirb es dir hier nicht! :p