2014-06-07 18 views
6

Czy w WebGL można zapisać wartość głębi fragmentu lub kontrolować wartość głębi fragmentu w inny sposób?Webgl: alternatywa dla pisania do gl_FragDepth

O ile mogę znaleźć, gl_FragDepth nie jest obecny w webgl 1.x, ale zastanawiam się, czy jest jakikolwiek inny sposób (rozszerzenia, wsparcie dla przeglądarki itp.).

To, co chcę zarchiwizować, to odtworzenie obiektu z promieniem śledzenia wraz z innymi elementami narysowanymi za pomocą zwykłego modelu, widoku, rzutu.

+0

Możesz manipulować wartością głębi w module cieniującym wierzchołka, tak jak to 'gl_Position.z = x * 2.0 - 1.0', gdzie' x' w '[0,1]' (lub '[-1,1]' bez '* 2.0 - 1.0') ... Ale to zadziała, jeśli 'gl_Position.w = 1.0' ... –

+0

@andre Nie ma jeszcze rozwiązania? –

+1

@ViktorSehr wygląda jak niektóre przeglądarki, które teraz implementują rozszerzenie. Zobacz zaakceptowaną odpowiedź. – andre

Odpowiedz

4

Jest rozszerzeniem EXT_frag_depth

Bo to rozszerzenie może nie być dostępne wszędzie, więc trzeba sprawdzić, że istnieje.

var isFragDepthAvailable = gl.getExtension("EXT_frag_depth"); 

Jeśli isFragDepthAvailable nie jest falsey następnie można włączyć go w swoich shaderów z

#extension GL_EXT_frag_depth : enable 

W przeciwnym razie można manipulować gl_Position.z w vertex shader choć podejrzewam, że naprawdę nie jest dobrym rozwiązaniem dla większości potrzeb.

2

Brad Larson ma sprytne obejście tego, że używa się cząsteczek (full blog post):

Aby obejść ten problem, I wdrożone moje własne bufor głębokości zwyczaj pomocą obiektu bufora ramki, który był związany z tekstura wielkości ekranu . Dla każdej ramki najpierw wykonuję przejście renderowania, w którym jedyną wartością wyjściową jest wartość koloru odpowiadająca tej głębokości na . Aby obsłużyć wiele nakładających się obiektów, które mogą zostać zapisane w tym samym fragmencie, włączam mieszanie kolorów i używam równania mieszania GL_MIN_EXT. Oznacza to, że komponenty koloru użyte dla tego fragmentu (R, G i B) są minimum wszystkich składników, które próbują zapisać do tego fragmentu (w moim układzie współrzędnych głębokość 0.0 jest zbliżona do przeglądarka, a 1.0 jest daleko od siebie ). Aby zwiększyć dokładność wartości głębokości zapisanych do tej tekstury, zakodowuję głębię do koloru w taki sposób, że wraz ze wzrostem wartości głębokości , czerwony zapełnia się najpierw, następnie zielony, a na końcu niebieski. To daje mi 768 poziomów głębokości, który działa całkiem dobrze.

EDYCJA: Właśnie zrealizowane WebGL nie obsługuje min blendingu, więc niezbyt użyteczne. Przepraszam.