그림자 맵 아티팩트


16

3D XNA 게임에 그림자를 추가하고 싶습니다. 하나의 조명과 하나의 카메라로 테스트 환경을 설정했습니다. 그러나 나는 내 접근 방식으로 인공물을 만난다.

http://pastebin.com/zXi0hmsU 의 셰이더 코드 를 사용하여 최종 결과를 렌더링하고 http://pastebin.com/rY4Gcj9N 을 사용하여 그림자 맵을 만듭니다. 이 코드는 매우 직설적이며 빛의 관점에서 뎁스 맵을 생성 한 다음이를 카메라 공간에 투영하고 폐색 여부를 확인합니다.

그러나 대부분의 각도에서 나는 꽤 추악한 결과를 얻었습니다.이 스크린 샷 에서처럼

장면은 몇 가지 간단한 큐브 (손으로 구성되어 외부를 향하고 후면이 컬링 됨), 하나의 조명 (왼쪽 상단 모서리에 표시된 그림자 맵-괜찮아 보입니다)과 하나의 카메라로 구성됩니다.

그림자 맵에 대한 내 RenderTarget은

int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
    shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
    DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

그런 다음 CreateShadowMap효과가 적용된 다음 LambertWithShadows 효과가 적용됩니다. 마지막으로 그림자 맵은을 사용하여 그려집니다 SpriteBatch.

나머지 코드는 쉐이더에 올바른 값을 제공하는 것입니다. 필요한 경우 잘 제공 할 수 있습니다.

답변:


19

이것은 그림자 맵 여드름 이라는 전형적인 문제 입니다. 그림자 맵의 투영 된 픽셀 (깊이)이 화면의 픽셀보다 크기 때문에 발생합니다 (예 : 깊이를 정확하게 표현할 수 없음).

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

이에 대한 해결책이 많이 있습니다. 가장 쉬운 것은 편견입니다 (코드에서 볼 수 있으므로 문제는 아닙니다). 두 번째 쉬운 해결책은 더 큰 해상도의 그림자 맵입니다. 현재 hw에서 해상도 2048x2048의 그림자 맵을 갖는 것이 일반적입니다. (편집 : 사실이 아닙니다. 영화 렌더링 작업을 할 때 작성했습니다. 게임 개발에서는 그림자 맵을 최대한 작게 유지하고 싶습니다)

좀 더 고급 기술을 연구하기위한 자료.


편집하다:


나는이 주제에 관한 더 많은 자료를 가지고 있습니다. 관심이 있다면 나도 공유 할 것입니다.
Notabene

큰 해상도의 주된 문제는 최종 게임에서 약 3-4 개의 조명이 지시되지 않은 것입니다. 추가 자료가있는 경우, 자료를 나에게 공유하려는 귀하의 노력을 정말로 소중히 여길 것입니다 :-)
Etan

나는 그것이 중요하다면 적어도 관심이있다 :)
James

1
@Etan. 예, 전 방향 조명은 그림자에 대해 이야기 할 때 정말 고통 스럽습니다. (나는 그것에 대해 알고 있습니다 :) gamedev.stackexchange.com/questions/6203/… ). 이중 포물면 맵을 사용해보십시오. 또는 큐브 맵을 좋아하는 경우 모든 얼굴 / 렌더링에 대해 frustum-camera_frustum 교차로 컬링을 통해 공간을 절약하십시오. 항상 모든 방향에 대해 그림자가 필요하지 않습니다 (특히 외부에서)
Notabene

1
@Etan @James 나는 당신을 위해 더 많은 것들을 추가했습니다. 이 주제에 관심이 있다면 둘 다 읽을 가치가 있습니다.
Notabene
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.