gl_FragCoord.z
to wartość głębi okna dla bieżącego fragmentu. Nie ma nic wspólnego z wartością przechowywaną w buforze głębi. Wartość może być późniejsza zapisana do bufora głębi, jeśli fragment nie jest discard
ed i przechodzi test szablon/głębokość.
Technicznie istnieją pewne optymalizacje sprzętu, które wcześnie zapisują/testują głębokość, ale dla wszystkich intencji i celów gl_FragCoord.z
nie jest wartością przechowywaną w buforze głębi.
Jeśli nie wykonasz renderowania w wielu przejściach, nie możesz odczytać i zapisać do bufora głębi w module cieniowania fragmentów. Oznacza to, że nie można użyć tekstury głębi do odczytania głębi, a następnie odwrócić i napisać nową głębię. Przypomina to próbę implementacji mieszania w module cieniującym fragmentów, chyba że zrobisz coś egzotycznego ze sprzętem klasy DX11 i ładowaniem/przechowywaniem obrazu, to po prostu nie zadziała.
Jeśli potrzebna jest tylko głębokość końcowej narysowanej sceny dla odwzorowania cienia, można wykonać wstępne przejście tylko do głębokości w celu wypełnienia bufora głębi. W drugim przejściu odczytałeś bufor głębi, ale nie zapisałeś do niego.
'gl_FragCoord.z' jest wartością głębi aktualnie przetwarzanego fragmentu, a nie aktualną wartością w buforze głębi. Aby uzyskać teksturę głębi, utwórz teksturę z formatem głębi, wyślij do pliku FBO z teksturą głębi dołączoną do pliku GL_DEPTH_ATTACHMENT, a następnie połącz teksturę głębi do próbkowania w module cieniującym fragmentu. –
@RetoKoradi, brzmi jak odpowiedź, dlaczego zrobiłeś komentarz? – JWWalker
@JWWalker: Ponieważ byłem w pośpiechu i zwykle staram się sformułować moje odpowiedzi nieco ostrożniej i bardziej szczegółowo. Zamienię to w odpowiedź. –