Grenze zwischen Ober- und Unterwasser zeichnen



  • Hallo zusammen
    Ich bin nun gerade dabei, die Wasserobefläche zu rendern, was mit Hilfe von Displacement Mapping und Vertex Texture Lookups hervorragend funktioniert. Das Problem ist nun allerdings, dass die Kamera auch ins Wasser (Unterwasser) gehen kann, und aus diesem Grund möchte ich oberhalb und Unterhalb der Wasseroberfläche einen komplett anderen Shader benutzen. Zusätzlich habe ich einen Postrendering Filter, welcher nur "Unterwasser" zum einsatz kommen soll. Hat jemand eine Idee, wie man so etwas realisieren kann? Der Z-Buffer sowie der Stencil Buffer sind IMHO keine Lösung, weil ja während dem Renderpass der Wasseroberfläche, sowohl Oberhalb des Wassers, sowie auch Unterhalb des Wassers nichts gezeichnet wurde. (Der Stencil Buffer würde also bspw. beide Regionen markieren.

    Mfg Samuel



  • Ein möglicher Ansatzpunkt wäre vielleicht die "discard" Expression des Pixelshaders?



  • Wenn du dir es einfach machen kannst und willst, dann sorg dafür dass die Kamera nur entweder unter oder über der Wasseroberfläche sein kann, aber nicht beides gleichzeitig.

    World of Warcraft handhabt das beispielsweise so, da wird ab einem bestimmten Punkt zwischen Unterwasser- und Überwassersicht umgeschaltet.



  • @Nukularfüsiker
    Jetzt habe ich so schöne (auch hohe) Wellen mit Displacement und Normalmapping hingekriegt, das soll ich jtzt wieder löschen? NIEMALS!!! :p Ich habe es mittlerweile geschafft, dass ich die Koordinate eines Pixel im Screenspace an den Pixelshader übergeben kann (in einer Texturkoordinate). Was ich bräuchte wäre sowas wie eine 1D Textur, bei der ich für jede Bildspalte den höchsten Pixel speichere, denn ich gezeichnet habe. (Im Screenspace) Gibt es eigentlich eine Möglichkeit, von einem Pixelshader aus in mehrere Texturen zu rendern? Das währe wirklich mal ein Schritt nach vorne! 🙂


  • Mod

    Ishildur schrieb:

    Was ich bräuchte wäre sowas wie eine 1D Textur, bei der ich für jede Bildspalte den höchsten Pixel speichere, denn ich gezeichnet habe.

    und dann rotierst du die camera ein wenig und es hat nichts mehr mit spalten zu tun. die hoehe steht in deiner displacementmap.

    Gibt es eigentlich eine Möglichkeit, von einem Pixelshader aus in mehrere Texturen zu rendern? Das währe wirklich mal ein Schritt nach vorne! 🙂

    so wie MRT meinst du?



  • @rapso

    und dann rotierst du die camera ein wenig und es hat nichts mehr mit spalten zu tun.

    Ja shit, absolut richtig 😞 Hast du eine Idee, wie ich mein Vorhaben umsetzen könnte?

    so wie MRT meinst du?

    Wow, eine Unmenge an Glückshormonen überschwemmen gerade in diesem Augenblick meinen Körper 🙂



  • @rapso

    und dann rotierst du die camera ein wenig und es hat nichts mehr mit spalten zu tun.

    Hmm, wobei, wenn diese im Screenspace sind, doch schon. Alles was ich dann noch tun muss, ist überprüfen ob der UpVektor nach oben oder nach unten schauf (ebenfalls im Screenspace) ?



  • Irgendwie muss ich dafür aber aus dem Rendertarget lesen können, in das ich gerade schreibe... Geht das?



  • Ishildur schrieb:

    Irgendwie muss ich dafür aber aus dem Rendertarget lesen können, in das ich gerade schreibe... Geht das?

    Das weisst Du doch schon.


  • Mod

    Ishildur schrieb:

    @rapso

    und dann rotierst du die camera ein wenig und es hat nichts mehr mit spalten zu tun.

    Ja shit, absolut richtig 😞 Hast du eine Idee, wie ich mein Vorhaben umsetzen könnte?

    das hatte dir mein naechster satz gesagt.

    Ishildur schrieb:

    @rapso

    und dann rotierst du die camera ein wenig und es hat nichts mehr mit spalten zu tun.

    Hmm, wobei, wenn diese im Screenspace sind, doch schon. Alles was ich dann noch tun muss, ist überprüfen ob der UpVektor nach oben oder nach unten schauf (ebenfalls im Screenspace) ?

    und wenn up 90grad nach rechts schaut?



  • und wenn up 90grad nach rechts schaut?

    Ja verdammt, hast natürlich recht!

    das hatte dir mein naechster satz gesagt.

    Ja ich verstehs leider noch nicht ganz, wofür die Displacement Map in diesem Fall gut ist, ich weiss ja im Postrenderer nicht, an welchen Stellen die Displacement Map gesampelt wurde?


  • Mod

    du weisst die nearplane position in worldspace, das sollte doch reichen um aus der displacement zu lesen.



  • Ja schon aber was bringt mir das? Die Displacement Map wurde ja vom ersten Renderpass nicht entlang der NearPlane gesampelt?


  • Mod

    dis displacementmap ist nicht nur ne heitmap fuers wasser? (ich denke das ist der gaengiste weg zZ es zu machen).



  • Doch schon, aber die Werte daraus werden doch interpoliert und der VertexTextureFetcher funktioniert IMHO etwas anders als der PixelTextureFetcher. Daher muss ich davon ausgehen, dass ein tex2D im Pixelshader mir was leicht anderes zurückgeben wird als ein tex2Dlod im VertexShader (auf dieselbe Displacement Map), oder sehe ich das falsch?


  • Mod

    Ishildur schrieb:

    Doch schon, aber die Werte daraus werden doch interpoliert und der VertexTextureFetcher funktioniert IMHO etwas anders als der PixelTextureFetcher. Daher muss ich davon ausgehen, dass ein tex2D im Pixelshader mir was leicht anderes zurückgeben wird als ein tex2Dlod im VertexShader (auf dieselbe Displacement Map), oder sehe ich das falsch?

    Ist die selbe hardware, woher hast du dass die TMUs anders configuriert wurden fuer PS/VS? (ich geb zu, hab mich nicht informiert ob da etwas anders forciert wurde).



  • Ich kann den Artikel nicht mehr finden. Ich hatte zuerst Probleme weil ich zuerst pDev->SetTexture(0,this->txWts->GetTexture()); anstatt pDev->SetTexture(D3DVERTEXTEXTURESAMPLER0,this->txWts->GetTexture()); verwendet habe. Bei der Suche nach Hinweise bin ich auf einen Artikel (oder Forum?) gestossen, in welchem geschrieben wurden, dass nur ganz bestimmte Formate unterstützt werden und und das Filtering generell anders ablaufen würde. Auf der anderen Seite lese ich in Foren so allerlei... :p Also verlass dich lieber nicht auf meine Aussage 😉

    Kurz eine andere Frage (auch zu Wasser). Wenn ich in die Sonne sehe (so dass das Specular Lighting auf der Wasseroberfläche wirkt) sieht das ganze Filmreif aus (oder so), aber sobald ich mich von der Sonne wegdrehe (also die Lichtquelle) im Rücken habe, sieht das Wasser einfach nur noch aus wie Scheisse... 😞 Dies liegt wahrscheinlich daran, dass keiner der Vektoren in der Normalmap genug tief liegt, dass noch ein Lichtstrahl in meine Kamera reflektiert wird. Was für Möglichkeiten gäbe es noch, die Wasserqualität dennoch verbessern, auch wenn das Specularlighting nicht anschlägt (weil Sonne im Rücken)?


Anmelden zum Antworten