Autor Wątek: Jak zrobić glow?  (Przeczytany 2035 razy)

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Styczeń 11, 2011, 21:45:35
Cześć. Chciałbym, aby ktoś mi pomógł i wytłumaczył mi na chłopski rozum, krok po kroku jak zrobić efekt glow dla laserów w mojej grze. Załączam dwa rysunki jak jest teraz i jak to powinno mniej więcej wyglądać. Próbuję się bawić z tymi RenderTargetami ale coś robię nie tak i statki mi znikają a lasery zmieniają tylko kolor - i nie ma żadnego glow-a. Shader do glow-a już mam. Fajnie by było gdyby to działało tylko dla widocznych laserów, tzn jak jakiś jest w połowie zasłonięty to glow działa tylko na tej widocznej części. Z góry wielkie dzięki za jakąkolwiek pomoc.

Offline Mr. Spam

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

Offline mihu

  • Użytkownik
    • mihu

# Styczeń 11, 2011, 21:53:17
Jeśli korzystasz z metody z GPU Gems:
http://http.developer.nvidia.com/GPUGems/gpugems_ch21.html
(a jeśli nie korzystasz, to spróbuj), to trudno coś więcej wyjaśnić, tam jest wszystko dobrze opisane.
Jeśli masz błędy w kodzie to tłumaczenie metody może niewiele pomóc. Napisz dokładnie co robisz i gdzie pojawia się problem.

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Styczeń 11, 2011, 22:05:11
public static void DrawAll(GameTime time)
        {
            Camera.ActiveCamera.Game.GraphicsDevice.SetRenderTarget(0, laserRenderTarget);
            for (int la = 0; la < weapons.Count; la++)
            {
                weapons[la].Draw(time);
            }
            Camera.ActiveCamera.Game.GraphicsDevice.SetRenderTarget(0, null);
        }

Generalnie to jest wywoływane do narysowania laserów, ale wszystko to co się później ma wyświetlać znikło. (Właśnie, na początek chodzi mi o samo wyrenderowanie do innego target-u, jak to się uda to pomyślimy dalej)

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Styczeń 11, 2011, 22:24:21
Jeśli chodzi o render targety to powinieneś wyrenderować np. 3 takie. 1 jako obraz główny (rozmiar okna),
2 jako obeaz pośredni (np. 2/3 rozmiaru okna) i 3 jako zblurowany obraz (no niech będzie 1/3 rozmiaru okna) i teraz pozostaje tylko połączyć 1 obraz z drugim.

[EDIT] Zapomniałem dodać że obraz 3 renderujesz na podstawie obrazu 2, a 2 na podstawie 1 :)

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Styczeń 11, 2011, 22:42:28
No ok. ale czemu kod, który umieściłem wyżej powoduje, że po ustawieniu rendertargetu na 0,null nie rysują się statki? Przecież to powienien być główny backbuffer.

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Styczeń 11, 2011, 23:02:01
No ok. ale czemu kod, który umieściłem wyżej powoduje, że po ustawieniu rendertargetu na 0,null nie rysują się statki? Przecież to powienien być główny backbuffer.
Ja ci tego nie powiem bo nie znam XNA :)

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Styczeń 11, 2011, 23:23:23
Nie, tego się raczej nei da zrobić... używam GUI Neoforce Controls i one coś tam kręca z tymi rendertargetami, a dokumentacji do tego nie ma jedynie autowygenerowane docs-y. Trudno. O "wodotryskach" pomyśle jak już gra będzie w pełni funkcjonalna.

Offline .c41x

  • Użytkownik
    • homepage

# Styczeń 12, 2011, 10:13:41
Ten przykład z GPU gems to wg. mnie tu trochę przesada dla tego zastosowania. Ja bym zrobił tak:
1. Do rendertargeta o zmniejszonym rozmiarze renderujesz głębie całej sceny (bez laserów) - potem same lasery (na czarnym tle)
2. Blur powyższego rendertargeta
3. Rysujesz wszystko (lasery też :)) i dodajesz do wyniku renderowania ten zblurowany RT (np. rysując fullscreenquada z addytywnym blendingiem).
« Ostatnia zmiana: Styczeń 12, 2011, 12:37:58 wysłana przez .c41x »

Offline mihu

  • Użytkownik
    • mihu

# Styczeń 12, 2011, 12:22:08
Ten przykład z GPU gems to wg. mnie tu trochę przesada dla tego zastosowania. Ja bym zrobił tak:
1. Do rendertargeta o zmniejszonym rozmiarze renderujesz same lasery (na czarnym tle)
2. Blur powyższego rendertargeta
3. Rysujesz wszystko (lasery też :)) i dodajesz do wyniku renderowania ten zblurowany RT.
A czym przykład z GPG różni się od tego co napisałeś? :)

Offline .c41x

  • Użytkownik
    • homepage

# Styczeń 12, 2011, 12:35:30
No może faktycznie niewiele... :) na pewno różni sposobem liczenia źródeł glow-a: w przypadku lasera - cały laser jest źródłem glow-a, a w przykładzie GPG takim źródłem mogą to być dowolne fragmenty sceny.
« Ostatnia zmiana: Styczeń 12, 2011, 12:38:59 wysłana przez .c41x »

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Styczeń 12, 2011, 19:23:32
No może faktycznie niewiele... :) na pewno różni sposobem liczenia źródeł glow-a: w przypadku lasera - cały laser jest źródłem glow-a, a w przykładzie GPG takim źródłem mogą to być dowolne fragmenty sceny.
A czy laser nie jest dowolnym fragmentem sceny?

Offline shadow864

  • Użytkownik

# Styczeń 13, 2011, 18:28:30
No ok. ale czemu kod, który umieściłem wyżej powoduje, że po ustawieniu rendertargetu na 0,null nie rysują się statki? Przecież to powienien być główny backbuffer.
Normalnie to powinno działać.
Może przez przypadek go czyścisz.

 Czy jak nie wywołujesz funkcji DrawAll(GameTime time) to wszystko działa a dopiero jej wywołanie powoduje nie renderowanie się statków?(Możesz pokazać włąściwe Draw?). Jeśli tak to wydaje mi się to dziwne. 

Offline Dab

  • Redaktor
    • blog

# Styczeń 13, 2011, 18:40:12
Pamiętaj że potrzebujesz bufora głębi żeby wyrenderować świecące obiekty. Zamiast robić dodatkowy pass możesz po prostu zrobić HDR na RGB16F, laserom dać jakiś kolor > 1 a przy bloomowaniu obciąć wszystko < 1.