Jump to content

[Tutorial] Dodawanie nowego rendertargetu


LVutner

Recommended Posts

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. 

 

  • Cool 2
  • Positive 6
Link to comment
Share on other sites

  • 2 months later...

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

Link to comment
Share on other sites

  • 2 weeks later...

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.