나는 당신이 무엇을 프로그래밍하고 있는지 모르겠지만, 이것이 XNA에서 그것을 처리하는 방법입니다.
- 드로우 콜에서
List<Light>
객체가 생성 / 삭제됩니다.
- 타일 드로우 루프 동안 각 타일에 조명이 연결되어 있는지 확인합니다. 그렇다면
Light
개체가에 추가됩니다 List<Light>
.
- 타일은 자체적으로 그려집니다
RenderTarget2D
.
- 타일 루프 후
Light
s 목록은 RenderTarget2D
다음과 같이 만든 텍스처를 사용하여 자체적으로 반복되고 그려집니다 .
(참고 : 여기에 R, G 및 B 값을 사용했지만 실제 질감.)
- 커스텀 셰이더를 사용하여 타일 표면을 화면에 렌더링하고 조명 표면을 각 픽셀의 "어둠"값에 대해 샘플링되는 매개 변수로 전달합니다.
이제 몇 가지주의 할 사항이 있습니다.
포인트 4 :
실제로 2 개의 커스텀 셰이더가 있는데, 하나는 조명 렌더 타깃에 조명을 그리고 (4 단계), 다른 하나는 조명 렌더 타깃을 사용하여 화면에 타일 렌더 타깃을 그리는 것입니다 (5 단계).
포인트 4에서 사용 된 셰이더를 사용하면 "명도"값을 추가 할 수 있습니다. 이 값은 float
렌더 타겟에 추가되기 전에 텍스처의 각 픽셀에 곱 해져서 기본적으로 조명을 밝거나 어둡게 만들 수 있습니다.
이 시점에서 조명의 "스케일"값도 고려합니다. 즉, 하나의 텍스처 만 사용하여 크고 작은 조명을 가질 수 있습니다.
포인트 5에 관하여 :
조명 렌더 타깃은 기본적으로 0 (검정)에서 1 (흰색)까지 각 픽셀의 값을 갖는 것으로 생각하십시오. 셰이더는 기본적으로 타일 렌더 대상의 픽셀에 대한 RGB 값과 해당 값을 곱하여 최종 그려진 이미지를 만듭니다.
또한 주간 / 야간 오버레이 색상으로 사용될 값을 (쉐이더에) 전달하는 코드가 더 있습니다. 이것은 또한 RGB 값으로 곱해지고 조명 렌더 타겟 계산에 포함됩니다.
이제, 이것은 물체 주위를 둘러싼 빛을 차단하는 것과 같은 것을 할 수는 없지만 적어도 내 목적으로는 간단하고 잘 작동합니다.
여기 및 여기에 더 자세한 블로그 게시물을 작성했습니다 . 지금은 시간이 없지만 원하는 경우 gamedev에서 더 자세히 설명 할 수 있습니다.
아, 여기 내지도 편집기에서 살펴 보겠습니다.