2017-05-14 6 views
5

보이지 않는 비행기에서 그림자를 렌더링하는 방법을 알아 내려고 노력했습니다. 따라서 내 sceneView의 배경이 보여줍니다.장면 킷의 투명 바닥/평면에 그림자를 표시합니다.

THREE.js는 정확하게 그림자를 렌더링하는 ShadowMaterial을 가지고 있습니다.

현재의 생각은 직관적 인 맞춤 금속 쉐이더를 만드는 것이지만, 그림자에서 벗어난 모든 것을 보여주기 위해 바닥을 노크하는 방법을 잘 모르겠습니다.

여기에 그림자 포수의 예 : https://knowledge.autodesk.com/search-result/caas/sfdcarticles/sfdcarticles/Maya-2015-Shadow-Catching-with-Use-Background-material.html

+0

어떤 그림자를 사용하고 있습니까? 그림자 맵핑, 섀도우 볼륨? 또한, 현재'sceneView' 3d 객체를 그릴 수 있습니까? –

+0

앰비언트 및 스포트라이트 'SNNodes'를 사용하여 다이나믹 섀도우를 만들었는데, 어떤 사과가 후드 아래에서하고 있는지 확실하지 않습니다. 나는 내 SceneKit 뷰 위에 UIView를 배치 할 수있다. – jfisk

답변

4

좋아, 그래서 Github에서에이 예제 프로젝트를 체크 아웃 :

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

링크는 그림자 맵 테스트를 수행하는 쉐이더입니다. 기본적으로 렌더링되는 프래그먼트의 Z 위치를 정규화하고이를 섀도우 맵의 Z 버퍼와 비교합니다. 그림자 -Z보다 작 으면 픽셀은 완전히 켜져 있고 (줄 67) 그렇지 않으면 약간 채도가 있습니다 (줄 69).

대신 할 일은 69 행에는 write (0,0,0, shadow_opacity), 67 행에는 (0,0,0,0)입니다. 이것은 투명한 픽셀을 방출해야합니다. shadow_opacity를 [0.0..1.0]에서 유니폼으로 설정하십시오.

나머지 설정은 example에 표시됩니다. 비행기/카메라를 원하는 설정으로 기울이고, 실제로 장면에 넣지 않으려면 main pass의 큐브/꽃병/무엇이든 그려서는 안됩니다 (라인 279). (단, shadow pass을 기록해 두십시오).