GenshinCelShaderURP
요약
본 프로젝트는 Unity URP 파이프라인 기반의 카툰 렌더링(Cel Shader)을 구현한 오픈 소스 셰이더입니다. 원신 캐릭터의 독특한 카툰 렌더링 방식을 재현하는 것을 목표로 하며, 사용 용이성과 확장성을 모두 고려했습니다. 설치 후 머티리얼에서 추가된 셰이더를 활용하며, PC, 모바일, 콘솔 등 다양한 플랫폼에 호환되도록 설계되었습니다.
핵심 포인트
- Unity URP 기반의 카툰 렌더링(Cel Shader) 프로젝트입니다.
- 원신 캐릭터 스타일 재현을 목표로 하는 오픈 소스 셰이더입니다.
- 바디와 페이스를 분리하여 특수 효과 처리가 가능합니다.
- URP Forward 파이프라인에 최적화되어 있으며, 커스터마이징이 용이합니다.
GenshinCelShaderURP
이란 무엇인가?
이것은 Unity 엔진 URP 파이프라인 기반의 카툰 렌더링 프로젝트입니다. 일정 기간 수정 과정을 거쳐 기본적으로 이런 형태로 통합하여 사용하게 되었습니다. 기술적 난이도는 전반적으로 높지 않으며, 주로 여러 개발자들의 공학적인 결과물들을 통합하는 과정에서 진행되었습니다. 오랜 시간 동안 효과에 대한 조사를 거치면서 핵심만 추출하여 하나의 셰이더로 통합하고 패키징했습니다. 현재 이 셰이더는 여전히 unlit을 사용하고 있으며, 향후 lit으로 전환될 예정입니다. 공유라는 오픈 소스 정신에 따라 본 프로젝트를 여러분과 공유하기로 결정했으며, 또한 오픈 소스를 통해 코드 품질을 높이고자 합니다. 우리의 목표는 원신 캐릭터의 카툰 렌더링 방식을 재현할 수 있는 렌더링 라이브러리를 만드는 것입니다. 사용 용이성을 보장하는 동시에 확장성을 유지하고, PC, 모바일, 콘솔 등 다양한 플랫폼과의 호환성, 성능 및 효과를 모두 고려했습니다.
설치 및 사용법
/Shaders/GenshinCelShaderURP/ 경로 아래의 해당 버전 폴더를 Assets에 압축 해제하기만 하면 머티리얼(Material)에서 추가된 셰이더를 확인할 수 있습니다.
시작하기 전에, 최소한 다음과 같은 텍스처가 준비되어야 합니다. 만약 어떻게 얻어야 할지 모른다면, Bilibili의 @小二今天吃啥啊 튜토리얼을 참고할 수 있습니다. 링크


(1) RGBA 채널의 바디 Base Map (2) RGBA 채널의 바디 Light Map(ILM Map) (3) 바디 Shadow Ramp (4) 페이스 Base Map (5) 페이스 그림자 SDF 임계값 맵 (6) 헤어 Base Map (7) RGBA 채널의 헤어 LightMap(ILM Map) (8) 헤어 ShadowRamp (9) 페이스 그림자 Mask (10) 메탈릭 러프니스 Map
텍스처 예시
-
바디 부분:
图片
图片
图片 -
얼굴의 특수 처리:
图片
图片
지원
셰이더 호환성(범용성)에 관해서는 현재 URP의 Forward 파이프라인에서 작동하는 데 한정됩니다. 만약 지연(Deferred) 파이프라인에서 사용해야 한다면, 직접 Render Objects를 설정해 주십시오.
PS. 여러 게임 개발사마다 ILM 텍스처 처리 방식에 약간의 차이가 있으므로, 필요에 따라 수정하고 커스터마이징할 수 있습니다. 이론적으로는 ILM(물체의 그림자, 하이라이트 및 반사면을 표현)과 페이스 SDF 그림자 임계값 맵만 있다면 이 셰이더를 사용할 수 있습니다. 여기서 언급할 가치가 있는 점은, 《붕괴3》 구 캐릭터의 ILM 텍스처 방식과 신 캐릭터가 약간 다르다는 것입니다. 알파 채널로 Ramp 샘플링 영역을 제어하지 않기 때문에 효과가 다소 떨어질 수 있으며, 이 경우 직접 색 보정(Color Grading)이 필요할 수 있습니다.
샘플 모델용
예제에 사용된 모델과 텍스처는 /Model 경로 아래에 첨부되어 있습니다. 모델 출처: 모지우웨이(模之屋), 링크입니다. 제 셰이더와 결합하여 테스트하는 데 사용할 수 있으며, 모델의 최종 해석권은 mihoyo에 있습니다. 상업적 이용은 삼가주십시오.
Ramp Texture 생성 도구용
이配套(패키지) 도구는 Unity Editor 내에서 이 셰이더에 적합한 ramp texture를 생성하는 데 사용됩니다. 필요에 따라 ramp 색상을 커스터마이징할 수 있으며, 구체적인 사용 방법은 여기를 참고하십시오.
Ramp Texture에 대하여
우리는 셀 셰이딩(Cel Shading)의 본질, 즉 색상을 다수의 계조에서 적은 계조로 낮추어 계조의 풍부함을 줄임으로써 수작업으로 채색한 듯한 효과를 구현하는 것에 돌아가야 합니다. 쉽게 말해 계단식 조명입니다. 셀 셰이딩에는 두 가지 일반적인 방법이 있습니다. 하나는 조명 강도를 계산한 후 Ramp 텍스처를 샘플링하는 것이고, 다른 하나는 수학적 계산을 사용하여 Ramp 텍스처를 근사(fit)하는 것입니다. Ramp 텍스처를 샘플링하는 방식은 더 많은 제어성을 제공하며 더욱 직관적이고, 오버헤드도 크지 않습니다.

그림은 RampTexture 사용 후의 그림자입니다.

half3color = lerp(_ShadowColor, _Color, ramp );
이 방법은 Diffuse Warp(워프된 디퓨즈) 방식이며, 이 방식에서는 Ramp 텍스처를 사용합니다.

위와 같은 텍스처입니다.
《레기온 요새 2》에서 가장 먼저 이 Shading 방법을 사용했으며, 역사적으로도 의미가 깊습니다. 선명한 명암은 물론 부드러운 명암 표현까지 가능합니다. 저 역시 이 방법을 자주 활용합니다.
관련 자료 - https://steamcdn-a.akamaihd.net..
여러분은 위에 있는 Ramp 텍스처와 아래의 구현 효과를 함께 보시면, Ramp 텍스처가 결과에 어떻게 영향을 미치는지 알 수 있습니다. 우리는 이렇게 이해할 수 있습니다. RampTexture를 샘플링할 때 HalfLambert 값을 UV에 적용합니다. HalfLambert 값이 어두우면 텍스처의 왼쪽으로 매핑하고, 밝으면 텍스처의 오른쪽으로 매핑하는 식입니다.
가로축이 HalfLambert에 대응하는 방법 외에도, 세로축을 유연하게 처리함으로써 다양한 효과를 얻을 수 있습니다. 예를 들어, 성능 오버헤드를 고려하지 않고 여러 개의


이러한 방식의 장점은 명확합니다. 첫째, 성능 절약입니다. 반사광(diffuse)의 색상 부분은 어떤 광원 계산에도 참여할 필요가 없기 때문에 밝은 부분은 텍스처 색상이 되고, 그림자 색상은 이미 텍스처 형태로 미리 그려져 있습니다. 따라서 후처리 단계에서 광원의 방향만 제어하여 그림자의 위치를 조정하면 됩니다. 둘째, 아티스트가 그림자 색상과 명암 전환을 더욱 유연하게 제어할 수 있어 더 복잡한 스타일화된 효과 구현이 용이합니다. 단점은 모델러(미술가)에게 요구되는 수준이 매우 높다는 것입니다.
참고: 《원신》 캐릭터의 Ramp는 일반적인 Ramp 텍스처와 다른 점이 있습니다. 일반적으로 Ramp의 명암 경계선은 0.5 위치에 있지만, 이 경우 가장 오른쪽 근처에 위치하며, 변화가 크지 않은 밝은 부분 일부를 제거하여 대역폭을 절약하는 동시에 아티스트가 작업할 수 있는 공간을 제한받지 않도록 했습니다(Ramp 텍스처 압축으로 샘플링 감소).
샘플링 아이디어: 아래는 이 텍스처의 각 줄이 어떤 역할을 하는지에 대한 설명입니다:
Y축에 대해서는 LightMap.a 채널을 기반으로 광원 모델(halflambert)의 범위를 결합하여 계층적으로 Ramp 텍스처를 샘플링하고 확산광 색상을 부여합니다. 우리가 샘플링하는 픽셀이 차가운 색조와 따뜻한 색조 두 가지로 나뉘기 때문에, 낮과 밤의 다른 광원 환경에 적응하기 위해서는 shader_feature를 통해 샘플링 전환을 수행해야 합니다. 이는 인스펙터에서 조정할 수 있도록 간단한 if 문으로 구현하면 됩니다.
X축에 대해서는 원래의 lambert 값을 기반으로 smoothstep 리매핑을 수행하여, 0부터 특정 값까지의 그라데이션만 남기고 이보다 큰 값은 모두 Ramp의 가장 오른쪽 색상으로 샘플링합니다. 이렇게 하면 그림자 색상의 전환을 유지하면서도 하드 에지(hard edge)를 형성하여 명암을 매우 잘 구분할 수 있습니다.
마지막으로, 원신 내 ilm 텍스처 각 채널의 역할에 대해 보충 설명합니다:
LightMap.r : 하이라이트 유형 레이어. 값 범위에 따라 다른 하이라이트를 구별하며, ap.g : 그림자 AO ShadowAO 광원 및 matcap 금속 하이라이트.
LightMap.g : 그림자 AO ShadowAO Mask. 이는 두 번째 그림자로 이해할 수 있으며, 광원의 방향 변화와 무관한 상주(常駐) 그림자입니다.
LightMap.b : BltMap.a : Raask SpecularIntensityMa 확산광 암부 색상, htMap.a : Ramp 유형 레이어. 값 범위에 따라 다른 Ramp를 선택합니다(확산광 암부 색상을 제어하며 매우 중요).
LightMap.a : Ramp 유형 레이어. 값 범위에 따라 다른 Ramp를 선택합니다(확산광 암부 색상을 제어하며 매우 중요, 나중에 설명 예정).
VertexColor.g : Ramp 오프셋 값. 값이 클수록
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
https://github.com/YuiLu/GenshinCharacterShading
5、T.yz(知乎)(v3 버전 diffuse 모듈, ramp 샘플링, 결합, 조명 모델, ao 등 포함)
https://zhuanlan.zhihu.com/p/547129280
규칙 (Rules)
프로젝트 사용을 표준화하기 위해, 다음 용도로 사용할 수 있습니다...
애니메이션 스타일 렌더링 관련 지식 학습, HLSL 기본 문법 구조 이해, 개인 독립 게임 개발(관련 코드는 MIT 라이선스를 준수하여 오픈 소스로 공개해야 함), 필요에 따라 소스 코드 커스터마이징 및 수정, MMD 등 영상 제작(만약 이 셰이더를 사용하려면 엔딩 크레딧이나 소개란에 Thanks 목록의 이름 중 일부를 명시할 것(내 이름을 적지 않아도 됨)).
다음 용도로는 사용할 수 없습니다...
- 본 모델을 사용하여 어떠한 상업적 활동 및 콘텐츠 제작에도 참여하는 것 금지
- 본 모델을 사용하여 성인물, 극단적인 종교 선전, 유혈 공포 기괴 작품, 인신 공격 영상, 폭력, 선정성, 반사회적, 정치적 내용의 제작에 참여하는 것 금지
- 본 모델에 모욕적이거나 기이한 방식으로 개조하는 것 금지
- 셰이더 전체 코드를 수정하는 것은 허용되지만, 항상 출처를 명시해야 합니다(Thanks 목록 중 어떤 작가들의 코드를 사용했는지 반드시 그들을 표기할 것).
- 개인 간에 어떠한 형태로든 2차 배포(즉, 프로젝트 파일을 2차 전파)하는 것 금지
- 원작자의 허가를 받지 않은 상업적 용도(거래 판매/상업 광고 홍보 영상 등) 사용 금지
- 본 장면으로 MMD 영상을 제작하는 경우에만 허용되며, 다른 영역(VRCHAT/게임 MOD 등)에는 사용 금지
- 기타 GPL 오픈 소스 라이선스를 위반하는 행위
다섯 번째 규칙을 준수하는 전제 하에, 이 셰이더를 2차 배포하는 것은 허용되지만, 항상 Github/Gaolingx로 출처를 명시해야 합니다.
링크 (Links)
작가 관련 정보를 더 알고 싶으시면 다음을 방문해 주세요:
米游社@爱莉小跟班gaolx, Bilibili@galing2333
끝 (End)
마지막으로, 모두 즐겁게 사용하시길 바라며, 이 프로젝트는 지속적으로 업데이트될 예정입니다. 저희 프로젝트에 관심이 있다면 별점(star)을 눌러주세요. 이것이 저희에게 가장 좋은 격려와 지지입니다. 저는 단지 고등학교 3학년 학생이라 코딩 실력이 제한적입니다(qwq). 부족한 점이 있다면 너그러이 양해 부탁드립니다. 만약 셰이더 부분에 대해 좋은 아이디어, 의견 또는 제안이 있으시면 Issues에서 논의하거나 PR을 제출해 주세요. 이메일로도 연락 주실 수 있습니다 ([email protected]). 제 작품이 가치가 있다고 느끼신다면 후원해 주시면 정말 감사하겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub GameDev의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기