[Tutorial] Dodawanie nowego rendertargetu

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ę :face_with_tongue:

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ę naxr_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 :slightly_smiling_face:

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.

8 polubień

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ę.

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.