Skocz do zawartości

[Tutorial] Dodawanie nowego rendertargetu


LVutner

Rekomendowane odpowiedzi

Witam. Jako że mam dzisiaj chwilę czasu, to namotam Wam o tym jak poprawnie zrobić nowy rendertarget. 
Poradnik będzie w formie tekstowej, ale nie omieszkam wrzucić tutaj kilku obrazków, z informacją z czym to się je.

Wszystko będzie pokazane na przykładzie shaderu dla LUT tekstur, portowanego z projektu Oxygen, do mojego forku OGSR engine, aka rebirtha. Prosto, szybko, i przyjemnie.

Zaczynamy.

 

Co będzie potrzebne:

  • Visual Studio - w wersji odpowiedniej dla repozytorium z silnikiem
  • Repozytorium z naszym silnikiem'
  • Notepad++

 

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Otwieramy Notepada, i wklejamy sobie owy kod:
https://pastebin.com/dnbghB4S

Zapisujemy nasz plik jako blender_lut.cpp

 

Ale, jak to tak, o co tutaj biega? Co to te s_lut_* i inne?

s_lut_* - są to nasze 2d samplery w których będzie przechowywana nasza tekstura. 
Dodałem ich pięć sztuk, możecie więcej ich dodać ale pamiętajmy o jednym. Limit samplerów w jednym shaderze
dla PS 3.0 wynosi 16


A ten no, s_image to co to jest?

Jest to krótko mówiąc obraz, przed zaaplikowaniem shadera. 

Ten sampler musi tam być, ponieważ nakładamy shader na obraz, nie na pustkę :P

 

Dobra a te ścieżki ogse//costam??

Są to ścieżki w których będziemy przechowywać tekstury. 

Krótko mówiąc w folderze gamedata\textures\ogse\lut
Jak zauważyliście, tekstury mają swoje nazwy, lut_*
Należy je zapisywać w formacie dds.
 

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Jedziemy dalej z koksem.

Otwieramy znów naszego Notepada, i wklejamy kod:
https://pastebin.com/Sgzm94Hj

Zapisujemy plik jako blender_lut.h

 

A objaśnisz o co tutaj biega???

Właściwie nie ma co tutaj objaśniać.

LUT Shader jest naszym komentarzem, gdy shader będzie kompilowany, silnik dostanie informację o tym.
Możecie sobie nawet wpisać "hehe shaderek" zamiast LUT Shader.

 

I właściwie, blendery dla naszego nowego shadera mamy gotowe. Możemy przystąpić do

klejenia nowego rendertargeta. 

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Znów otwieramy notepada, i znów wklejamy kod:
https://pastebin.com/wBnXMwNH

Jest to nasz rendertarget.

 

Ej ale widze tutaj jakieś "lut_control". Co to jest??

Jest to nowy uniform. Będziemy go dodawać na sam koniec, będzie on kontrolować
teksturę w shaderze. Wcześniej dodaliśmy ich pięć w blenderze, zatem będziemy je przełączać
komendą w grze. Również dodamy komendę aby można było wyłączyć nasz shader.

 

Ej a ta cała linijka to co to jest?  RCache.set_c("lut_control", ps_r2_lut_control, 0, 0, 0);

Tak jak wcześniej wspominałem, tekstury będą kontrolowane komendą. Owe zera są zwyczajnie
odwołaniem dla uniformów. XYZW. My użyjemy wektora X który będzie liczbą całkowitą.
Gdybyśmy chcieli zrobić bardziej rozbudowany shader, rozwijamy uniform o kolejne wektory pamiętając
aby je odpowiednio dopisać.
Np.   RCache.set_c("lut_control", ps_r2_lut_control.x, ps_r2_lut_control.y, ps_r2_lut_control.z, 0);

 

Zapisujemy nasz pliczek jako r2_rendertarget_phase_lut.cpp

I robimy sobie kawę. 

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Ej dobra dobra, ale trzeba pliki dodać do visuala chyba nie???

Owszem, trzeba to zrobić gdyż Visual sam z siebie ich nie odnajdzie. 

Nowe pliki wrzucamy do folderu z naszym rendererem. W moim
przypadku ten folder to:

ogsr_engine\Layers\xrRender_R2

Potem w VS musimy je dodać. Jak to zrobimy? Ano o tak o:

 

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

 

Dodane? To lecimy dalej. 

Trzeba teraz wszystko ze sobą skleić do kupy w renderze.

 

Otwieramy plik r2_rendertarget.cpp.

Na samym początku pliku widać #include. Pod blenderami dodamy nasz.

#include "blender_lut.h"

 

Lecimy dalej z dynksem. 
W tym samym pliku zrobimy jeszcze kilka nowych rzeczy.

Zjeżdzamy w dół i szukamy linijek zaczynających się na 

b_***

Pod nimi sobie wciśniemy nasz blenderek.

b_lut = xr_new<CBlender_lut>();

 

Znów lecimy w dół w rendertargecie i musimy dodać kolejną linijkę

Szukamy sobie linijek zaczynających się na s_
I wciskamy naszą pod spód.

s_lut.create (b_lut, "r2\\lut");

 

No i ostatnia zmiana w tym pliku... lecimy znów nisko.

Szukamy linijek zaczynających się na xr_delete
Pod nimi wklejamy naszą

xr_delete(b_lut);

 

Zapisujemy plik.
I dopijamy naszą kawę.

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\


Otwieramy plik r2_rendertarget.h

Szukamy sobie linijek zaczynających się na:
IBlender*

Wklejamy swoją pod spodem (w moim przypadku pod combine)
IBlender* b_lut;
 

I znów żmudne przesuwanie suwaczka w notepadzie.

Szukamy znów linijek, ale tym razem:
ref_shader

Swoją dajemy pod spodem
ref_shader s_lut;

 

To wszystko? Jeszcze nie.

Jedziemy na sam dół pliku jak windą. 

Pod linijkami void, dajemy swoją:
void phase_lut ();

 

Zapisujemy plik.

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Zostało nam jedynie dodać jedną linijkę która nam "włączy" nowy rendertarget.

Rzecz jasna możemy dodać do niej kawałek kodu, przez co rendertarget będzie można włączać
jak i wyłączać, ale o tym już w następnym poradniku :)

Otwieramy plik r2_rendertarget_phase_combine.cpp

Mamy taką linijkę do dodania..
phase_lut();

Gdzie ją dodamy?
Jedziemy do mniej więcej dwusetnej linijki w pliku. 

// screen space "volume" effects

Takowa linijka była u mnie (OGSR engine). 
Przez chwilkę patrzymy jak inne "phase_xxx();" są dodane, i poniżej linijki:

 

if (ps_r2_pp_flags.test(R2PP_FLAG_AA)) phase_aa();
   


Dodajemy naszą, 

phase_lut();


Zapisujemy plik, i kompilujemy silnik. To wszystko. 

 

  • Super 2
  • Dodatnia 6
Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 miesiące temu...

Proszę o wyjaśnienie słowa rendertarget , co toto porabia i co ma być jego efektem. Mniemam iż chodzi o rendering np. terenu ale pewności nie mam. Pytam ponieważ chciałbym stworzyć mapę terenu w oparciu o konkretne geodezyjne współrzędne X,Y i H (zwane też jako Z) opartą o siatkę pomierzonych punktów. Silnik X-ray wydaje się być bardzo mocnym i chyba przewyższający możliwościami typowe programy CAD-owskie. Fajne było by przedstawienie rzeczywistego miejsca z możliwością przemieszczania się po nim tak jak w grze.  Z zawodu jestem geodetą więc stąd to moje zainteresowanie tematem. Kontakt z grą (a może bardziej symulacją niż grą) Stalker mam od jego początku.  Co do programowania to kiedyś pisałem programiki do obliczeń geodezyjnych w dawno chyba już zapomnianym BASIC-u. No może nadszedł czas nauczyć się czegoś nowego. Będę wdzięczny za odpowiedzi oraz podpowiedzi. Pozdrawiam kolegę.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Rendertarget - w skrócie kolejna faza obrazu.
Może być wykorzystany dla nowych modułów cieniowania tj. shadery.

Osobiście nowe rendertargety tylko do tego wykorzystuję, gdyż jak wiadomo - nie można dodawać kilkunastu efektów wykorzystujących finalny obraz gry. 
Wykorzystując nowe rendertargety znosimy ograniczenie ilości samplerów, nie psujemy finalnego obrazu, i możemy kontrolować nasz shader w czasie rzeczywistym.


Co do map, nie mam bladego pojęcia.  XRay jest dla mnie strasznie zgmatwany jeśli chodzi o mapy.  
Wydaje mi się że takowa mapa byłaby możliwa do zrobienia, kwestia jej wymodelowania, poprawnego ustawienia i potem dalszej obróbki.

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Korzystając z tej strony, zgadzasz się na nasze Warunki użytkowania.