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:

  1. renderowanie głębi do tekstury. Jak możemy to zrobić i jaki jest kompromis?
  2. Użyj wartości podanej przez gl_FragCoord.z-ale: czy to jest prawidłowa wartość?
Author: genpfault, 2014-04-29

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:

  1. Tworzenie i Wiązanie FBO. Sprawdź połączenia typu glGenFramebuffers i glBindFramebuffer, jeśli wcześniej nie korzystałeś z FBO.
  2. 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 lub glFramebufferRenderbuffer. If you only dbając o głębokość z tego przejścia renderowania, możesz pominąć to i renderować bez bufora kolorów.
  3. Utwórz teksturę głębi i przymocuj ją do GL_DEPTH_ATTACHMENT punktu mocowania FBO.
  4. wykonaj renderowanie, które tworzy głębię, której chcesz użyć.
  5. użyj glBindFramebuffer, aby przełączyć się z powrotem do domyślnego bufora ramki.
  6. Połącz teksturę głębi z samplerem używanym przez Shader fragmentów.
  7. 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.

 23
Author: Reto Koradi,
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 discarded 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.

 5
Author: Andon M. Coleman,
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