Mam renderbuffer (DepthStencil) w FBO i muszę uzyskać z niego teksturę. Wygląda na to, że nie mogę mieć zarówno tekstury DepthComponent, jak i bufora renderującego DepthStencil w FBO, więc potrzebuję jakiegoś sposobu, aby przekonwertować bufor renderujący na teksturę DepthComponent po tym, jak skończę z nim do późniejszego wykorzystania w potoku.
Próbowałem wielu technik, aby pobrać komponent głębokości z bufora renderowania od tygodni, ale zawsze wychodzę z śmieciami. Na koniec chcę tylko tej samej tekstury, którą otrzymałbym od FBO, gdybym nie używał bufora renderowania. Czy ktoś może opublikować wyczerpujące instrukcje lub kod, który obejmuje tę pozornie prostą operację?
EDYTOWAĆ:
Linky do wyodrębnionej wersji kodu http://dl.dropbox.com/u/9279501/fbo.cs
Screeny efektu głębi pola + FBO - bez głębi (!) Http://i.stack.imgur.com/Hj9Oe.jpg
Screeny bez efektu głębi pola + FBO - głębia działa dobrze http://i.stack.imgur.com/boOm1.jpg
To, o co pytasz, jest możliwe w OpenGL 3.2. Mój FBO wypluwa rozproszony kolor na teksturę koloru, normalny na teksturę innego koloru i głębię na teksturę głębokości - nie są potrzebne bufory renderujące. W rzeczywistości renderbuffery to tylko problem, ponieważ nie można próbkować z nich, więc trzeba będzie użyć
glReadPixels(...)
lub w inny sposób skopiować dane z RBO do tekstury na procesorze, zamiast po prostu utrzymywać wszystko w pamięci GPU. Więc...Jeśli naprawdę chcesz, możesz napisać kod w shaderze pierwszego przejścia, aby ręcznie wyprowadzać takie rzeczy, jak głębia, do osobnego załącznika tekstury koloru w FBO. Będzie to do wykorzystania przez ciebie w shaderach po przejściu. Do użytku OpenGL w wewnętrznych testach głębokości dodatkowo potrzebujesz zestawu RBO lub zestawu tekstur jako GL_DEPTH_ATTACHMENT twojego FBO. Ale możesz ustawić jedną teksturę, która będzie obsługiwała obie - jest to bardziej wydajne i łatwiejsze w użyciu.
Mój kod konfiguracji tekstury głębi wygląda tak (Java, po prostu zignoruj rzeczy ByteBuffer ... i zwróć uwagę, że używam „id” w odniesieniu do uchwytów / wskaźników liczb całkowitych, ponieważ ta koncepcja nie jest zbyt dobra w Javie):
I później:
Możesz teraz przekazać
gBufferDepthTexture
(lub co masz) mundur do swoich shaderów fragmentów drugiego, trzeciego przejścia. Myślę, że możemy bezpiecznie założyć, że możesz zrobić dokładnie to samo z buforem wzornika.źródło
Powinieneś być w stanie utworzyć teksturę (zamiast RenderBuffer) przy użyciu formatu GL_DEPTH_STENCIL. Nie jestem pewien dokładnego procesu używania głębokości z takiej tekstury w programie do cieniowania (który, jak zakładam, używasz, ponieważ używasz FBO), ale specyfikacja OpenGL powinna określać, które kanały kolorów uzyskują jakie wartości ( zgaduję, że R, G i B są ustawione na głębokość, a A na szablon).
Obecnie celuję w OpenGL 3.2, więc może być konieczne sprawdzenie, czy format tekstury jest dla ciebie odpowiedni. Nigdy nie pamiętam, które wersje wprowadzają różne funkcje.
źródło