Używam SDL2 .
Obecnie mój jedyny moduł cieniujący ma matrycę MVP i przekształca za jej pomocą punkty.
Obliczam moją macierz widoku i projekcji dla kamery z GLM:
glm::lookAt(pos, pos + forward, up);
glm::perspective(fov, aspectRatio, zNear, zFar);
Przeszukałem go, ale mogę znaleźć tylko starszą implementację wielu rzutni.
Jeśli utworzę na przykład 4 kamery i powiedzmy, że wszystkie są takie same , tyle że każda kamera ma do renderowania inną ćwiartkę ekranu . (Więc chcę 4 rzutnie o tej samej treści)
W jaki sposób mogę to zrobić? Przepraszam, jeśli nie podałem wystarczających informacji, możesz zapytać.
Odpowiedzi:
Renderowanie do różnych rzutni (części) tego samego ekranu można wykonać w następujący sposób:
Na przykład podzielenie ekranu na cztery części i renderowanie tej samej sceny cztery razy w każdym rogu z różnymi mundurami i różnymi rzutniami:
źródło
viewport
są x, y lewego dolnego rogu porcji i szerokość, wysokość porcji. Dzięki mieszaniu możesz eksperymentować.Jeśli piszesz własny Shader Vertex / Fragment, istnieje jeszcze jedna dodatkowa możliwość. Jest to znacznie bardziej skomplikowane, ale może być przydatne dla Ciebie i / lub innych osób. Dodatkowo przyspiesza cały proces rysowania, ponieważ używa tylko jednego wywołania polecenia rysowania. Maksymalna liczba rzutni jest zdefiniowana przez GL_MAX_VIEWPORTS i zwykle wynosi 16.
Od OpenGL 4.1 istnieje metoda glViewportArrayv . Może definiować tablicę rzutni. Rzutnie utworzone tą metodą mają przypisany indeks.
Tego indeksu można użyć w module cieniującym wierzchołków, aby ustawić rzutnię, do której renderowana jest scena. (Musisz dodać rozszerzenie „ ARB_shader_viewport_layer_array ” do kodu modułu cieniującego)
W twoim przypadku proponuję wykonać następujące czynności:
źródło
To jest kopia odpowiedzi @ narthex, z wyjątkiem tylko rzutni, ponieważ to wszystko, czego potrzebujesz. Nie jestem pewien, dlaczego bufor / mieszanie ramek zostało uwzględnione w jego odpowiedzi.
źródło
To są wszystkie dobre odpowiedzi, a jednak istnieje inny sposób: (czy nie zawsze?)
Ze względu na rosnącą popularność rzeczywistości wirtualnej ludzie z OculusVR opracowali trio rozszerzeń „Multiview” o nazwie:
Rozszerzenia te umożliwiają renderowanie wielu widoków tej samej sceny w jednym wywołaniu losowania, eliminując nadmiarowość renderowania tej samej sceny w tym samym stanie z punktu widzenia każdego oka. Choć stworzony na potrzeby VR, deweloper niekoniecznie ogranicza się do zaledwie dwóch widoków. To rozszerzenie pozwala raczej na wyświetlenie tylu widoków, ile określa MAX_VIEWS_OVR .
Przed użyciem tych rozszerzeń programista powinien sprawdzić ich obsługę w sterowniku graficznym użytkownika, dodając następujący kod:
Następnie należy skonfigurować bufor ramki do korzystania z tej funkcji:
i podobnie w module cieniującym:
W aplikacji związanej z procesorem to rozszerzenie może znacznie skrócić czas renderowania, szczególnie w przypadku bardziej złożonych scen :
źródło