OpenGL - jak uzyskać dostęp do wartości bufora głębokości? - Lub: gl FragCoord.Z vs. renderowanie głębi do tekstury
Chcę uzyskać dostęp do wartości bufora głębi w aktualnie przetwarzanym pikselu w shaderze pikseli.
Jak możemy osiągnąć ten cel? Zasadniczo wydaje się, że istnieją dwie opcje:
- renderowanie głębi do tekstury. Jak możemy to zrobić i jaki jest kompromis?
- Użyj wartości podanej przez gl_FragCoord.z-ale: czy to jest prawidłowa wartość?
2 answers
Na pytanie 1: nie można bezpośrednio odczytywać z bufora głębi w shaderze fragmentów(chyba że są ostatnie rozszerzenia, z którymi nie jestem zaznajomiony). Musisz renderować obiekt bufora ramki (FBO). Typowe kroki:
- Tworzenie i Wiązanie FBO. Sprawdź połączenia typu
glGenFramebuffers
iglBindFramebuffer
, jeśli wcześniej nie korzystałeś z FBO. - Utwórz bufor tekstury lub renderbuffera, który będzie używany jako bufor kolorów, i dołącz go do
GL_COLOR_ATTACHMENT0
punktu załącznika FBO za pomocąglFramebufferTexture2D
lubglFramebufferRenderbuffer
. If you only dbając o głębokość z tego przejścia renderowania, możesz pominąć to i renderować bez bufora kolorów. - Utwórz teksturę głębi i przymocuj ją do
GL_DEPTH_ATTACHMENT
punktu mocowania FBO. - wykonaj renderowanie, które tworzy głębię, której chcesz użyć.
- użyj
glBindFramebuffer
, aby przełączyć się z powrotem do domyślnego bufora ramki. - Połącz teksturę głębi z samplerem używanym przez Shader fragmentów.
- Twój Shader fragmentów może teraz pobierać próbki z tekstury głębi.
On pytanie 2: gl_FragCoord.z
to wartość głębokości fragmentu, na którym działa shader, Nie to bieżąca wartość bufora głębokości w pozycji fragmentu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-29 17:55:17
gl_FragCoord.z
jest wartością głębokości okna-przestrzeni bieżącego fragmentu. Nie ma to nic wspólnego z wartością zapisaną w buforze głębi. Wartość może później należy zapisać do bufora głębi, jeśli fragment nie jest discard
ed i przejdzie test szablonu / głębokości.
Technicznie istnieją pewne optymalizacje sprzętowe, które będą pisać / testować głębokość wcześnie, ale dla wszystkich intencji i celów gl_FragCoord.z
nie jest wartością przechowywaną w buforze głębi.
Chyba że renderujesz w wielu przechodzi, nie można odczytywać i zapisywać do bufora głębi w cieniowaniu fragmentów. Oznacza to, że nie można użyć tekstury głębi, aby odczytać głębię, a następnie odwrócić się i napisać nową głębię. Jest to podobne do próby zaimplementowania mieszania w fragment shader, chyba że zrobisz coś egzotycznego ze sprzętem klasy DX11 i ładowaniem/przechowywaniem obrazów, to po prostu nie zadziała.
Jeśli potrzebujesz tylko głębi ostatniej narysowanej sceny do czegoś takiego jak mapowanie cieni, możesz wykonać wstępną analizę tylko głębi aby wypełnić bufor głębokości. W drugim przejściu, można odczytać bufor głębi, ale nie zapisać do niego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-29 18:01:06