Autor Wątek: Rendering chmur  (Przeczytany 3910 razy)

Offline Oti

  • Użytkownik

# Maj 07, 2012, 00:12:46
Bufor głębokości powinieneś mieć jako teksturę floating point. Wtedy tak, wyglądałby na cały biały, bo takiej tekstury nie da się poprawnie dokładnie wyświetlić. Wtedy nie będziesz musiał dzielić vPos.z przez 1000. I czemu dałeś tam minus? I nie wiem czy dobrze ustawiasz coord-ja mam to zrobione trochę inaczej:
float2 coords;
coords.x = IN.pos.x / IN.pos.w / 2.0f + 0.5f;
coords.y = -IN.pos.y / IN.pos.w / 2.0f + 0.5f;
Z tym, że ja robię w DX-w OGLu może być jednak trochę inaczej.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline limonki

  • Użytkownik

# Maj 07, 2012, 00:19:16
Mam go jako floating pointa. Czytałem, że podobno jeśli bufor głębokości jest 32 bitowy i podzielisz go przez 4 (8 bitów = 1 bajt, 32 / 8 = 4) to otrzymasz teksturę z zakresu 0 - 255. Ok ale zostawmy to. Depth ustawiam teraz na:

vec4 vsPos = gl_ModelViewMatrix * gl_Vertex;
depth = vsPos.z;

Tym razem cząsteczki się wyświetlają jednak dalej bez zamierzonego efektu.

Propo Twojego kodu. pos mam rozumieć to pozycja wierzchołka?

EDIT:

Przy takim ustawieniu depth'a niestety nie działa liczenie go dla cząsteczek. Musi być po staremu.
« Ostatnia zmiana: Maj 07, 2012, 00:22:53 wysłana przez limonki »

Offline miloszmaki

  • Użytkownik

# Maj 07, 2012, 00:41:04
pos to pozycja w vertex shaderze po przekszatłceniu wierzchołka przez macierz world*view*proj

i teraz w zależności od tego jaki masz depth buffer są 2 opcje:

1. bufor głębokości jest liniowy

przekazujesz do pixel (fragment) shadera pos.z, które będzie w zakresie [0,1] i to będzie właściwa głębokość danego pixela na ekranie

2. bufor głębokości jest nieliniowy (taki jest domyślny z-buffer)

przekazujesz do pixel (fragment) shadera pos.z i pos.w, gdzie następnie obliczasz głębokość:

depth = pos.z / pos.w

przy czym musisz to zrobić dopiero w PS, gdyż z i w muszą być najpierw zinterpolowane, a dopiero potem podzielone

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 07, 2012, 00:54:18
przy czym musisz to zrobić dopiero w PS, gdyż z i w muszą być najpierw zinterpolowane, a dopiero potem podzielone
W przypadku rysowania screen-aligned quadów możesz przekazywać od razu wynik dzielenia do PS. Zarówno Z jak i W są w tym przypadku stałe na powierzchni calego quada, więc i wynik będzie stały (a jak wiadomo, stałe dość dobrze się interpolują). ;)

Offline miloszmaki

  • Użytkownik

# Maj 07, 2012, 00:57:38
W przypadku rysowania screen-aligned quadów możesz przekazywać od razu wynik dzielenia do PS. Zarówno Z jak i W są w tym przypadku stałe na powierzchni calego quada, więc i wynik będzie stały (a jak wiadomo, stałe dość dobrze się interpolują). ;)

wiadomo ;) pisałem w przypadku ogólnym, zresztą chyba o to chodziło, nie? Czy te chmury jako screen-space quady chcesz rysować?

Offline limonki

  • Użytkownik

# Maj 07, 2012, 01:38:19
Czy te chmury jako screen-space quady chcesz rysować?

W jakim sensie?

Nie mogę tego ogarnąć do diabła. Pewnie dlatego, że jest już późno i mózg dobrze nie pracuje. Dobra ja lecę spać. Dzisiaj jak będę mieć czas po południu to będę jeszcze z tym kombinować. Trzymajcie się :)