2013-03-06 16 views
11

Przez jakiś czas pracowałem z this ES extension, ale wciąż nie wiem, co to są te próbki cieni i do czego można je wykorzystać. Googling naprawdę nie przyniósł mi żadnych przyjemnych, czytelnych wyników, więc zamieszczam tutaj.Co to są próbki cieni w OpenGL i jakie są możliwe zastosowania dla nich?

szukam czegoś, co pomogłoby mi naprawdę grok, co mogą one zrobić. Może to być rzeczywisty przypadek użycia lub coś, co po prostu pokazuje, w jaki sposób różnią się one od normalnych próbników. Mam na myśli, okey, przechowują dane głębokości. Ale w jaki sposób generowane są te dane? Czy jest on wykonany z tekstur przywiązanych do głębokości?

Ponadto, moje pytanie dotyczy zarówno DT (pulpit) i GL ES, i ewentualnie do WebGL zbyt; Nie dbam o dokładne połączenia ani wyliczenia, ponieważ można je łatwo znaleźć w specyfikacjach.

+0

Określenie, czy fragment jest w cieniu, polega na odczytaniu wartości z głębi tekstury i porównaniu jej z odległością fragmentu w przestrzeni światła. Jeśli ta pierwsza jest większa, jest w cieniu, w przeciwnym razie jest zapalona. Możesz to zrobić ręcznie lub za pomocą specjalnego samplera, który pobiera i porównuje kroki w jednym. Często zdarza się, że próbnik cieni oferuje także procentowe bliższe filtrowanie "za darmo". Oznacza to, że odczytaj 4 texele zamiast 1, porównaj wszystkie 4 i zwróć pojedynczą liczbę, która opisuje, jak wiele z tych testów nie powiodło się. Pozwala to na nieco gładsze obramowania cieni. – Damon

+1

@Damon dlaczego nie jest to odpowiedź? :) –

+0

Głównie dlatego, że nie jest wystarczająco rozbudowany i ponieważ nie mam dużego doświadczenia z GL ES (o co głównie chodzi). Musiałbym najpierw sprawdzić specyfikację tego konkretnego rozszerzenia, aby uzyskać w pełni kwalifikowaną odpowiedź (i mieć pewność, że to rozszerzenie ES nie zachowuje się rażąco inaczej niż oczekiwałem, tak jak w przypadku pulpitu GL).Chociaż mój komentarz może dać ci (który już dokładnie przeczytał tę specyfikację) wystarczającą wskazówkę, aby zrozumieć, o co chodzi. – Damon

Odpowiedz

10

A "shadow sampler" to próbnik używany do depth comparison textures. Zwykle, jeśli uzyskujesz dostęp do tekstury głębi, otrzymujesz (przefiltrowaną) wartość głębi na tej współrzędnej tekstury. W trybie porównania głębokości to, co robisz, to inna operacja.

Dla każdej próbki pobrane z tekstury, porównać głębokości z danej wartości. Jeśli porównanie przejdzie, wówczas pobrana próbka wynosi efektywnie 1,0. Jeśli porównanie nie powiedzie się, wynosi 0.0. Filtrowanie następnie działa na próbkach po tym porównaniu. Więc jeśli robię filtrowanie liniowe, a połowa próbek przechodzi przez porównanie, a połowa nie, wartość, którą otrzymuję, wynosi 0,5.

Aby to zrobić, należy włączyć aktywowanie porównania głębi obiektu/obiektu samplera, ale użytkownik musi także użyć samplera cieniowania w module cieniującym. Powodem tego jest fakt, że funkcja dostępu do tekstury musi teraz przyjąć dodatkową wartość: wartość porównywania dostępu tekstury do.

ten służy przede wszystkim do shadow maps, stąd nazwa. Mapy cienia przechowują głębokość od światła do najbliższej powierzchni. Dlatego porównujesz ją z głębokością od światła do renderowanej powierzchni. Jeśli renderowana powierzchnia jest bliższa światłu niż na mapie cienia, otrzymujemy 1,0 z próbnika cienia. Jeśli powierzchnia jest dalej od światła, otrzymasz 0.0. W obu przypadkach pomnóż wartość przez kolor światła, a następnie wykonaj wszystkie obliczenia oświetlenia dla tego światła, tak jak zwykle.

Powodem dla porównania przed pobierania próbek jest coś, co nazywa „Procent Bliżej Filtering”. Filtrowanie między wartościami głębokości nie daje rozsądnych rezultatów; to nie jest to, czego chcesz. Najpierw chcesz wykonać porównanie, a następnie przefiltrować porównane wyniki boolowskie. Następnie otrzymujemy pomiar liczby próbek z tekstury głębokości, które przeszły porównanie. Daje to lepsze wyniki wzdłuż krawędzi cieni.

+0

Cholera, to skomplikowane. Bardzo dziękuję za odpowiedź, po 3 czytam zaczynam ją zdobywać :) –