레이어간에 캐스트 된 2D 그림자는 어떻게 구현합니까?


10

다른 레이어의 객체에 의해 투사 된 2D 그림자를 어떻게 구현할 수 있습니까?

Catalin Zima 의 잘 알려진 자습서 의 동적 조명이 마음에 들지 않습니다 .

여기에 이미지 설명을 입력하십시오

그러나이 비디오 의 파이프 그림자처럼 :

여기에 이미지 설명을 입력하십시오

그리고이 비디오 의 플랫폼 그림자와 캐릭터처럼 :

여기에 이미지 설명을 입력하십시오

여러 레이어가 있고 여러 색상의 조명이 많은 장면에서 동일한 종류의 조명을 사용하고 싶습니다.

레이어 뒤의 레이어 위에 레이어의 검은 복사본을 그리고 그림자가 드리워지는 레이어의 구멍에 따라 레이어를 조정하여이 작업을 수행 할 수 있습니다. 그러나 나는 이것에 대해 더 저렴하고 픽셀 쉐이더 기반의 접근법이 있기를 바랍니다.

답변:


1

마스킹으로 수행 할 수 있습니다. 여러 가지 방법이 있습니다.

한 가지 방법은 그림자 버전의 전경 요소를 렌더링하는 방법을 사용하는 것입니다. 배경을 그립니다. 그런 다음 검은 색만 출력하는 방식으로 조명 이동 방법에 따라 약간 오프셋 된 전경 요소를 그립니다. 그런 다음 전경을 정상적으로 그립니다.

또 다른 방법은 전경을 버퍼로 렌더링하는 것입니다. 실제로 보는 것보다 조금 더 많습니다. 그런 다음 "검은 색으로"패스를하고 블러 패스를 수행하십시오. 이제이 패스 세트의 출력을 렌더링 한 다음 포 그라운드 버퍼의 보이는 섹션을 렌더링하십시오.

다른 각도에서 여러 조명을 지원하려면 이전 단계를 여러 번 수행하거나 단일 버퍼에 모두 누적하면됩니다. 수학은 달성하려는 내용에 따라 달라 지지만 첫 번째 비디오에서 진행되는 작업에 대한 첫 번째 추측은 카메라의 위치 (가시 영역의 중심)와 빛의 위치를 ​​취하는 것입니다. 그런 다음 해당 벡터 (크기 조정)를 사용하여 그림자를 오프셋하는 방법을 결정하십시오. 다음과 같은 것 :

draw background
for each light intersecting viewing bounds:
  offset = light.position - camera.position
  offset *= SCALE FACTOR (0.25 maybe)
  draw shadow foreground at offset
draw foreground

장면에 "가까운"조명의 배율은 더 작습니다. 여러 깊이를 원한다면 간단한 기하학적 요소로 계산할 수학이 있습니다.


그래, 이것이 바로 내가 만든 것입니다. 그래도 마스킹이라는 정확한 용어를 몰랐습니다. 그러나 3D 공간에서 그림자 볼륨이 작동하는 방식과 더 유사한 알고리즘이있을 것으로 기대했습니다.
Berry

구멍이있는 표면에 그림자를 드리 우면 그 뒤에있는 레이어 위에 상주 그림자를 드리워 야합니다. 또한 투명성 작업은 약간 까다로울 것입니다. 나는 이미 이러한 문제에 대한 모든 해결책을 생각했습니다! 그러나 특히 많은 레이어 (20)와 많은 조명 (50)을 다룰 때 실시간으로 적용하기에는 비용이 너무 많이들 것이라고 생각했습니다. 그렇기 때문에 다른 접근 방식을 원했습니다.
Berry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.