2D 게임에서 횃불 효과 (광원 주변의 밝은 영역)를 얻을 수 있습니까?


16

간단한 2D 게임을 작성하려고합니다. 처음에는 완벽한 그래픽이나 게임 플레이로 빛을 발하지는 않지만 PC 게임 개발의 첫 번째 단계라고 생각합니다. 따라서 간단한 스프라이트 기반 2D 게임 (예 : Heroes IV 또는 Startcraft BroodWar)을 상상해보십시오.

게임 플레이가 조명 변경에 따라 주 / 야를 지원하기를 원하며 동시에 모든 조명 뉘앙스에 대한 스프라이트를 만들어야하는 것은 광기입니다. 그래서 다른 객체 위에 반투명 레이어를 추가하는 것으로 충분하다고 결정했습니다.

이 솔루션의 문제는 게임에 광원 오브젝트가있는 경우 (토치 또는 불타는 건물과 같은 영웅) 주위에 더 밝은 영역이 있어야한다는 것입니다. 반투명 레이어를 모든 것 위에 배치하고 있기 때문에 원하는 횃불 시각 효과를 얻는 방법을 제안 하시겠습니까? 조명 효과에 따라 '갭'또는 다른 색상 영역을 추가하여 해당 레이어를 다시 그릴 수 있습니까?


2
가면이 갈 수도 있습니다
Gustavo Maciel

5
제목의 "Torchlight"는 Torchlight라는 게임으로 인해 혼란 스러울 수 있습니다.
Tetrad

4
@Tetrad 대문자가 아닌 한 괜찮습니다. 나에 관해서는, Torchlight는 귀하의 의견을 읽을 때까지 전혀 염두에 두지 않았습니다.
famousgarkin

그럼에도 불구하고 제목을 더 구체적으로 만들기 위해 편집을 제안했습니다.
famousgarkin

답변:


12

나는 당신이 무엇을 프로그래밍하고 있는지 모르겠지만, 이것이 XNA에서 그것을 처리하는 방법입니다.

  1. 드로우 콜에서 List<Light>객체가 생성 / 삭제됩니다.
  2. 타일 ​​드로우 루프 동안 각 타일에 조명이 연결되어 있는지 확인합니다. 그렇다면 Light개체가에 추가됩니다 List<Light>.
  3. 타일은 자체적으로 그려집니다 RenderTarget2D.
  4. 타일 ​​루프 후 Lights 목록은 RenderTarget2D다음과 같이 만든 텍스처를 사용하여 자체적으로 반복되고 그려집니다 .
    가벼운 질감 (참고 : 여기에 R, G 및 B 값을 사용했지만 실제 질감.)
  5. 커스텀 셰이더를 사용하여 타일 표면을 화면에 렌더링하고 조명 표면을 각 픽셀의 "어둠"값에 대해 샘플링되는 매개 변수로 전달합니다.


이제 몇 가지주의 할 사항이 있습니다.

포인트 4 :

실제로 2 개의 커스텀 셰이더가 있는데, 하나는 조명 렌더 타깃에 조명을 그리고 (4 단계), 다른 하나는 조명 렌더 타깃을 사용하여 화면에 타일 렌더 타깃을 그리는 것입니다 (5 단계).
포인트 4에서 사용 된 셰이더를 사용하면 "명도"값을 추가 할 수 있습니다. 이 값은 float렌더 타겟에 추가되기 전에 텍스처의 각 픽셀에 곱 해져서 기본적으로 조명을 밝거나 어둡게 만들 수 있습니다.
이 시점에서 조명의 "스케일"값도 고려합니다. 즉, 하나의 텍스처 만 사용하여 크고 작은 조명을 가질 수 있습니다.

포인트 5에 관하여 :

조명 렌더 타깃은 기본적으로 0 (검정)에서 1 (흰색)까지 각 픽셀의 값을 갖는 것으로 생각하십시오. 셰이더는 기본적으로 타일 렌더 대상의 픽셀에 대한 RGB 값과 해당 값을 곱하여 최종 그려진 이미지를 만듭니다.

또한 주간 / 야간 오버레이 색상으로 사용될 값을 (쉐이더에) 전달하는 코드가 더 있습니다. 이것은 또한 RGB 값으로 곱해지고 조명 렌더 타겟 계산에 포함됩니다.


이제, 이것은 물체 주위를 둘러싼 빛을 차단하는 것과 같은 것을 할 수는 없지만 적어도 내 목적으로는 간단하고 잘 작동합니다.

여기여기에 더 자세한 블로그 게시물을 작성했습니다 . 지금은 시간이 없지만 원하는 경우 gamedev에서 더 자세히 설명 할 수 있습니다.

아, 여기 내지도 편집기에서 살펴 보겠습니다.여기에 이미지 설명을 입력하십시오


모든 프레임이 너무 비싸지 않을 수있는 목록을 생성하고 지우십시오.
구스타보 메이 엘

@Gtoknu 내 게임에서 눈에 띄는 차이는 없습니다. 리스트는 메모리에 이미 존재하는 오브젝트에 대한 참조를 보유하고 있으므로 모든 라이트가 재생성되는 것과 같지 않으며 하나의리스트 만 있습니다.
Richard Marskell-Drackir

당신이 옳을 수도 있지만 완전히 아닙니다. 물론 전체 객체를 만들지는 않지만 참조에 대한 포인터를 추가하고 있지만 사용량은 적지 만 여전히 소비하고 있습니다. 당신은 좋은 방법으로 일을하고 있지만,리스트의 드로우 메소드 외부에리스트를 올리면 업데이트의 로직이 드로우보다 훨씬 빠르기 때문에 더 좋을 것이라고 생각합니다.
Gustavo Maciel

@Gtoknu 물론, 원하는 곳 어디에서나 목록을 선언 할 수 있지만 요점은 조명이 타일과 관련되어 있다는 것입니다. 타일 Draw방법은 타일에 조명이 있는지 여부를 확인하는 곳입니다. Update메서드 에서 그려진 모든 타일을 반복하지 않으므로 추가 오버 헤드가 추가됩니다. 또한 XNA는 Update초당 60 회 호출 되도록 보장하기 위해 Draw호출을 희생 할 수 있습니다. 즉,이 코드는 실제로 호출 빈도가 줄어 듭니다.
Richard Marskell-Drackir

결국, 공간 분할을 기반으로 조명을 자체 목록으로 이동하고 화면과 교차하는 섹션에 모든 조명을 그렸습니다. 나는 시간이 부족하여 내 게시물에서 그것에 대해 이야기하지 않았지만 내가 링크 한 두 번째 블로그 게시물에 언급되어 있습니다.
Richard Marskell-Drackir

9

일반적으로 2D 게임의 조명은 모든 스프라이트에 대해 노멀 맵 을 가지고 2D 스프라이트의 3D 조명 효과를 계산하여 수행됩니다. 이를 "2.5D"라고합니다. 그러나 나는하지 않을 것이다 첫 번째 게임에서는 복잡하기 때문에이 작업을 수행 것이 좋습니다.

XNA에서이 작업을 수행 한 사람의 멋진 비디오는 다음과 같습니다. http://www.youtube.com/watch?v=-Q6ISVaM5Ww

즉, 다양한 가정과 함께 작동 할 수있는 의사 조명 시스템을 속이고 얻을 수있는 방법이있을 것입니다.


이미이 비디오를 보았습니다.이 놀라운 기술에 대해 +1했습니다.
구스타보 메이 엘

조언과 비디오 링크를 주셔서 감사합니다. 실제로지도는 해결책 인 것 같습니다. 나는 내 상위 레이어에서 맵을 사용하여 '갭'을 만들거나 기본 객체에 미치는 영향을 변경하려고 시도했습니다.
Ivaylo Slavov

5

달성하려는 효과에 대해 완전히 구체적이지 않은 경우 접근 방식을 제안하기가 어렵습니다. 조명이 환경에 의해 방해를 받는지 여부, 게임의 관점, 조명이 환경과 어느 정도 상호 작용해야하는지 등의 세부 사항

그래도 나는 2 센트를 떨어 뜨릴 것이다. Catalin Zima의 Dynamic 2D Shadows 라는 자습서가 청구서에 맞는지 확인하십시오. 보시다시피, 빛은 반경을 가지며 장애물을 통과하지 않습니다. 실제 토치 라이트에 더 가깝게 보이도록 반경과 색상을 약간 애니메이션 할 수 있습니다.

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

이 경우 조명은 장면 위에 일종의 오버레이 역할을하지만 장애물을 고려하더라도 John의 예와 같은 정도로 상호 작용하지는 않습니다.

편집하다

Catalin은 그가 참조로 사용한 다른 기사로 연결되지만 연결이 끊어졌습니다. 업데이트 된 링크 는 다음과 같습니다 .


고마워, 나는 이것이 내가 후 효과가 아니라고 생각하지만, 공유해 주셔서 감사합니다 :)
Ivaylo Slavov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.