팁: 건설 단계를 모델링할 필요가 없습니다. 하나의 클립 셰이더로 제 건물 111개를 모두 만듭니다
요약
수동 모델링이 불가능한 다수의 건물(111개)을 하나의 클립 셰이더로 구현하는 방법을 설명합니다. 이 셰이더는 단일 진행 값(0-1)을 사용하여 벽, 바닥, 지붕 등 모든 건설 요소를 단계별로 동적으로 생성하고 폐기합니다. 이는 1400년대 베네치아를 배경으로 하는 상인 전략 게임에 적용되었습니다.
핵심 포인트
- 단일 클립 셰이더와 진행 값(progress value)을 이용해 다수 건물을 효율적으로 모델링 가능
- 벽체는 해시 값을 사용한 오프셋 처리로 비정형적인 단계를 구현함
- 건축 단계별(말뚝, 기초, 비계, 타일 등) 셰이더 클리핑을 통해 시각적 변화를 제어
- 그림자 전용 렌더러와 그림자 프록시 시스템으로 깊이 및 그림자 처리를 보완함
제 건물들은 단일 메쉬(single-mesh) 외피 구조물입니다 (벽과 지붕은 별도의 오브젝트가 아닙). 총 111개의 건물이 있는데, 이들을 수동으로 건설 단계별로 모델링하는 것은 불가능했습니다. 대신, 실제 메쉬에 건설 재료를 적용하고 하나의 0-1 진행 값(progress value)이 모든 것을 구동하도록 했습니다.
-
벽 (Walls): 높이에 따라 클립되지만 직선은 아닙니다.
셰이더는 '벽 상단' 위쪽의 모든 것을 폐기합니다. 레이저 커팅 같은 느낌을 피하기 위해, 상단부는 셀(cell)마다 해시 값(hash)으로 오프셋됩니다 (벽을 따라 약 반 미터, 높이는 3분의 1 미터). 따라서 쌓아 올린 돌처럼 고르지 않은 단계를 이루며 올라옵니다. 신선한 가장자리 바로 아래의 파편들에는 모르타르 색상(mortar tint)이 입혀집니다.
float2 cell = floor(posWS.xz * 2.2) + floor(posWS.y * 3.0) * 7.0; float top = _WallY + (Hash21(cell) - 0.5) * _Ragged; clip(top - posWS.y); -
바닥 (Floors): 온전하게 나타납니다.
수평 면(|normal.y| > 0.7)은 거친 절단(ragged cut)을 건너뛰고, 가장 낮은 단이 지나가면 한 번에 나타납니다. 셀 단위로 잘려나가서 부지 위에 흰색 패치처럼 보였습니다. -
지붕 (Roof): 서까래부터 타일 순입니다.
처마 위쪽의 상향 면(Up-facing faces)은 지붕으로 간주됩니다. 처음에는 월드 스페이스 그리드(world-space grid)만 살아남아 (frac(posWS.xz / step)), 이것이 서까래와 널빤지처럼 보이는 구조를 만듭니다. 그 후에 타일들이 채워집니다. -
모든 패스에서 클립 적용:
ShadowCaster, DepthOnly, DepthNormals에서도 동일한 기능을 사용합니다. 그렇지 않으면 건설되지 않은 부분도 그림자를 드리우고 깊이(depth) 값을 기록하게 됩니다. 'Cull Off'를 설정하고 어두운 뒷면을 처리하여, 내부가 비어있는 껍데기가 올라가는 것처럼 보이게 합니다. -
나머지 모든 요소는 동일한 진행 값에 따라 작동합니다:
0-10%: 말뚝(stakes), 로프, 흙;
10-25%: 기초 공사(foundations);
25-70%: 비계가 올라가는 벽체;
70-80%: 서까래와 박공벽(gables);
80-92%: 타일;
92-100%: 비계가 내려오는 과정. 100%에 도달하면 원래의 재료들이 돌아옵니다.
시간을 많이 소모한 문제점들 (Gotchas):
처마 높이는 위에서 바라본 상향 면(up-facing faces)으로부터 추정됩니다 (LOD1의 Mesh.AcquireReadOnlyMeshData 사용). 5% 영역 임계값으로 설정했더니, 13m짜리 주택에 발코니를 인식하여 처마를 4m로 잡았습니다. 전체 바닥면적의 85%는 제대로 작동합니다. 나중에 그림자 전용 렌더러(ShadowsOnly renderer)를 추가하는 '그림자 프록시 시스템(shadow-proxy system)'을 사용했으며, 노멀 재료에는 빈 부지 위에 완성된 건물의 그림자가 적용됩니다.
해당 사이트(site)는 이제 시작된 이후에 추가되는 렌더러(renderers)에도 재질을 다시 적용합니다. 사이트 아래의 지면은 TerrainData의 런타임 복사본(runtime copy) 위에서 평탄화되고 식생이 제거되어 에셋(asset)이 손상되지 않습니다. 이것은 제가 개인적으로 제작하고 있는, 1400년대 베네치아를 배경으로 하는 상인 전략 게임(merchant strategy game)인 FONDACO의 내용입니다. 누군가 원한다면 이 셰이더(shader)의 더 많은 부분을 공유할 수 있습니다.
제출자: /u/Harvan29 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/Unity3D (top/week)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기