전장안개 연구
아래는 고등학교 시절 메모한 내용을 LLM으로 다시 정리한 문서입니다.
전장의 안개#
전장의 안개는 플레이어가 직접 탐색하지 않거나 캐릭터의 시야 밖에 있는 지역에 대한 정보를 숨깁니다.
전형적으로 회색 또는 검은색으로 표시되어 맵의 해당 부분이 보이지 않게 됩니다.
여러 게임에서는 전장의 안개 시스템을 채용하고 있습니다. 이를 구현하기 위해 여러 가지 고민을 해보았습니다. 게임에서는 개발 편의성과 계산량을 줄이기 위해 타일 기반 시스템을 이용합니다. 처음에는 각 타일에 검은색 타일을 표시하고, 아군의 시야에 따라 처리하려 했습니다.

이와 같이 처리하면 기능은 구현되고 계산량도 적어집니다. 그러나 실제로 스타크래프트와 같은 게임에서 보이는 화면과는 상당히 차이가 있습니다. 처음에는 타일을 더 작고 많게 하거나 실제 게임 타일과 다른, 시야 처리에만 사용되는 타일을 위에 구현하는 것을 고민했습니다.

제가 원하는 방향은 스타크래프트와 같이 부드러운 안개였기에 다른 방법을 고민했습니다.

이와 같이 유닛별로 흰색에서 검은색으로 변하는 시야 이미지를 만들고, 안개라는 검은색 이미지에서 시야 이미지의 픽셀 값만큼 빼는 방식을 이용했습니다. 이전 타일 기반 방식에 비해 부드러워졌으며, 시각적으로도 개선되었습니다. 이를 통해 유닛별로 시야 크기나 모양도 변경할 수 있었습니다. 하지만 이 방식에도 문제가 있었습니다. 화면 전체를 덮을 검은색 이미지와 유닛의 시야 이미지 크기가 너무 커서 실시간으로 이미지 색상 값을 빼는 것은 상당히 부담스러웠습니다.

이를 해결하기 위해 생각한 아이디어는 우측 하단에 있는 미니맵이었습니다. 시야 이미지와 검은색 안개를 미니맵 영역 크기로 줄여 사용했습니다. 이후 미니맵에서 나온 결과 이미지를 확대하여 화면에 덮어 사용했습니다. 또한 갱신 시간도 완전 실시간이 아니라 일정 시간마다 시야 화면을 갱신하도록 했습니다.
void CRender::MakeAlpha( DWORD* pDark, DWORD* pView, D3DXVECTOR2 vPos, const STextureInfo* DarkInfo, const STextureInfo* ViewInfo )
{
D3DXVECTOR2 vCenter( vPos.x - (int)ViewInfo->m_TextureInfo.Width * 0.5f,
...