LVutner Opublikowano 9 Kwietnia 2019 Zgłoś Udostępnij Opublikowano 9 Kwietnia 2019 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ę 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. 2 6 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Stanley Opublikowano 14 Czerwca 2019 Zgłoś Udostępnij Opublikowano 14 Czerwca 2019 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ę. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
LVutner Opublikowano 24 Czerwca 2019 Autor Zgłoś Udostępnij Opublikowano 24 Czerwca 2019 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. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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.