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ę ![]()
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 ![]()
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.