2017-05-14 70 views
5

próbując dowiedzieć się, jak mogę renderować cień na niewidzialnym samolocie, więc pokazuje tło mojego sceneView.Pokazywanie cienia na przezroczystej podłodze/płaszczyźnie w scenekit

THREE.js ma ShadowMaterial, który robi dokładnie to - renderowany jest tylko cień.

Bieżące myślenie polega na wykonaniu niestandardowego shadera do metalu, który wygląda prosto, ale nie jestem pewien, jak rozwiązać problem znokautowaniem podłogi, aby pokazać wszystko poza cieniem.

Oto przykład z łapaczem cienia: https://knowledge.autodesk.com/search-result/caas/sfdcarticles/sfdcarticles/Maya-2015-Shadow-Catching-with-Use-Background-material.html

+0

Jakiego rodzaju cieni używasz? Mapowanie cienia, cienie w tle? Czy obecnie możesz rysować obiekty 3D 'sceneView'? –

+0

cienie dyanmiczne wykorzystujące otoczenie i reflektor 'SNNodes', nie wiedząc, co jabłko robi pod maską. Jestem w stanie umieścić 'UIView's nad moim widokiem SceneKit – jfisk

Odpowiedz

4

Ok, więc sprawdź ten przykładowy projekt na Github:

https://github.com/carolight/Metal-Shadow-Map/blob/master/Shadows/Shader.metal#L67

Ten link jest do modułu cieniującego, który wykonuje badanie cień mapa. Zasadniczo normalizuje on pozycję Z renderowanego fragmentu i porównuje go z buforem Z mapy cienia. Jeśli jest on mniejszy niż cień-Z, piksel jest w pełni oświetlony (linia 67) w innym przypadku jest lekko przyciemniany (linia 69).

Zamiast tego należy wpisać (0,0,0, shadow_opacity) dla wiersza 69 i (0,0,0,0) dla wiersza 67. Powinno to powodować wyświetlanie przezroczystych pikseli. Ustaw shadow_opacity jako jednolitą z [0.0..1.0].

Reszta konfiguracji jest pokazana w example. Przechyl płaszczyznę/kamerę do pożądanego ustawienia, pomiń rysunek kostki/wazonu/cokolwiek w main pass, jeśli naprawdę nie chcesz tego na scenie (linia 279). (Należy jednak pamiętać o numerze shadow pass i zachować go w tym miejscu).