Shader Code Review Template
셰이더 코드 리뷰 스킬
claude.md 구조
/shader-review Assets/Shaders/X.shader → 전체 리뷰
/shader-review Assets/Shaders/X.shader --compat → 호환성 집중
/shader-review Assets/Shaders/X.shader --perf → 최적화 집중
shader- review
# ========================
[실행 규칙]
- 본 템플릿의 placeholder는
<<FILL: ...>>형식으로 표시된다. <<FILL>>마커가 하나라도 남아있는 상태로 실행되면, 리뷰를 중단하고 사용자에게 해당 입력을 요청할 것.- 셰이더 본문 + 직접 include된 로컬 파일만으로 확정 불가한 항목은 "확인 필요"로 분리할 것 (RendererFeature / Material / MPB / Script / VariantCollection / Stripping / Project Settings 등).
========================
[프로젝트 환경]
- Unity: 6000.3.9f1
- URP: 17.3.0 (17.x 기준)
- 플랫폼: Mobile (Android / iOS)
- Graphics API: Vulkan / OpenGLES3 / Metal
- 렌더링: URP Forward ONLY
- RenderGraph: 필수
- SRP Batcher: 필수
- MSAA: OFF
- AA: FXAA
- HDR: OFF
- Color Space: Linear
- 타겟 GPU:
- Mali (TBIMR / 일부 구형은 IMR)
- Adreno (FlexRender / Tile-Based)
- PowerVR (TBDR, HSR)
- Apple Metal (TBDR)
========================
[입력 정보]
- 대상 파일 경로: <<FILL: 예) Assets/Shaders/BG_Lit_Break_AO.shader>>
- 리뷰 범위: <<FILL: 연관된 파일 / 특정 Pass / 특정 함수>>
- 셰이더 유형(복수 선택 가능): <<FILL: Lit / Unlit / Outline / Stencil / Depth / Shadow / Utility>>
- 의도한 기능(복수 선택 가능): <<FILL: 조명 / 그림자 / 라이트맵 / AlphaClip / 투명 / SSAO / Depth / 기타>>
- 직접 include하는 로컬 파일:
- <<FILL: 경로 1>>
- <<FILL: 경로 2>>
========================
[리뷰 원칙]
- 추상적 표현 금지.
- 문제 없으면 왜 문제 없는지 설명.
- 취향 차이와 실서비스 리스크를 구분할 것.
- 코드 의도는 존중하되 실서비스 기준으로 판단할 것.
- 같은 이슈를 중복 반복하지 말 것.
- 규칙 위반 시 반드시 근거 제시.
위치 특정 규칙:
- 가능하면
파일명:줄번호 - 줄번호가 어려우면 함수명 / Pass명 / pragma 블록 / 코드 3줄 이내 인용으로 특정.
판정 기준:
- Critical 존재: 리젝.
- Critical 없음 + Major 존재: 수정 후 사용 가능.
- Minor / Nice to Have만 존재: 즉시 사용 가능.
- "확인 필요" 항목은 판정에 영향 주지 않으나, 해소 전까지는 판정 앞에 "조건부 —" 접두를 붙인다.
- 예) "조건부 — 수정 후 사용 가능"
수정 코드 규칙:
- 모든 Critical / Major는 가능한 한 실제 치환 가능한 수정 코드를 포함할 것.
- 원인이 셰이더 본문 또는 직접 include된 로컬 파일에서 확정되는 경우에 한함.
- 외부 시스템 의존 이슈는 수정 코드 대신 "확인 필요 + 확인 대상"으로 정리할 것.
- 수정 코드 포맷은 Before / After 블록을 기본으로 하며, 변경량이 작을 때만 diff 사용.
========================
[핵심 체크리스트]
- 안정성 / Undefined / NaN
- divide by zero
- normalize(0)
- sqrt 음수
- atan2(0,0)
- pow/log 입력 범위
- NaN / INF 전파 가능성
- 초기화되지 않은 값 사용 가능성
- Linear 환경에서 잘못된 감마/리니어 수동 변환 존재 여부
- GPU / API 호환성
- Vulkan / GLES / Metal 해석 차이 위험
- precision 혼용 (경고) 및 half / min16float 미활용 (경고)
- Position / ClipPos / Depth 누적은 float
- Color / Normal / UV 파생 계산은 half 원칙
- 암묵적 캐스팅
- dynamic indexing / LUT / 큰 uniform array
- 드라이버 민감 패턴 / undefined behavior
- 플랫폼별 특수 리스크
- PowerVR / Apple (TBDR + HSR): AlphaTest / discard 시 HSR 무력화로 비용 급증
- Mali (TBIMR): 초기 세대 early-z 취약, 현세대는 개선
- Adreno (FlexRender): 드라이버 버전별 이슈 다수
- URP 구조 / Pass / LightMode
- Pass 구성이 셰이더 역할 대비 최소/적절한지
- LightMode 정확성
- UniversalForward / UniversalForwardOnly
- ShadowCaster / DepthOnly / DepthNormals / Meta
- UniversalGBuffer / MotionVectors
- UniversalForward vs UniversalForwardOnly 선택 적절성
- URP 17.x 구조와 어긋나는 레거시 패턴 존재 여부
- Unity 6 / URP 17.x 신규 항목
- GPU Resident Drawer / BRG 호환성 (
DOTS_INSTANCING_ON,UNITY_DOTS_INSTANCED_PROP) - Render Layer Mask 대응 필요 여부
- STP / TAA 사용 시 MotionVectors Pass 필요 여부
- Forward+ 사용 시
_FORWARD_PLUS/_CLUSTERED_RENDERING키워드 정합성
- GPU Resident Drawer / BRG 호환성 (
- SRP Batcher
CBUFFER_START(UnityPerMaterial)외부에 머티리얼 프로퍼티 선언 여부- 동일 프로퍼티 중복 선언
- instancing property와 material property 경계 문제
- UnityPerMaterial 레이아웃 깨짐 가능성
- GPU Resident Drawer 사용 시 UnityPerMaterial 정렬/크기 제약 준수 여부
- SRP Batcher 비호환 패턴 존재 여부
- 키워드 / Variant
- 셰이더의 의도된 기능 범위 기준으로 필요한 키워드만 평가
- 필요한 키워드 누락 여부
- 불필요 키워드 / variant 과다 여부
- Forward ONLY 프로젝트에서
_FORWARD_PLUS존재 시 타당성 검토 shader_feature_local/shader_feature/multi_compile사용 구분 적절성- global keyword 낭비 가능성
- DOTS_INSTANCING 대응 필요 시
multi_compile _ DOTS_INSTANCING_ON누락 여부
- 성능
- texture fetch 수
- 동일 텍스처 중복 샘플링 / 샘플 결과 재사용 누락
- branch / loop 비용
- 비싼 수학 연산 (pow, exp, log, trig, sqrt)
- bandwidth 병목 가능성 (모바일 최우선 지표)
- Texture2DArray / dependent read 비용
- varying 수 과다 여부
- register pressure 가능성
- 중간 변수 / loop 내부 계산 과다 여부
- half 적극 활용으로 줄일 수 있는 구간 존재 여부
- AlphaClip / Transparent / Overdraw
- MSAA OFF + FXAA 환경에서 edge 품질 문제
_ALPHATEST_ONaliasing / shimmer / temporal instabilitydiscard/clip사용 시 플랫폼별 영향 분리- TBDR (PowerVR / Apple): HSR 무력화 → 페널티 큼
- IMR / Tile-Based IMR (Mali / Adreno): early-z 지연, 페널티 상대적으로 작음
- Transparent overdraw 비용
- 필요 시 Pre-Z (DepthPrepass) 고려 여부
========================
[보조 체크리스트]
- ShaderLab 메타
- Tags 정합성
- RenderType / Queue /
RenderPipeline="UniversalPipeline"/ IgnoreProjector
- RenderType / Queue /
- LOD 적절성
- FallBack 사용 여부
- CustomEditor 필요성
#pragma target/#pragma require과도 여부 및 근거
- 헤더 / 문법 / 샘플링 스타일
HLSLPROGRAM / ENDHLSL사용CGPROGRAM / ENDCG사용 금지- 근거: SRP Batcher 비호환, Built-in 전용 include(UnityCG.cginc 등) 강제 유입, URP 매크로와 충돌
- URP ShaderLibrary 사용 여부 (Core.hlsl / Lighting.hlsl 등)
- Built-in 전용 include 사용 여부 (UnityCG.cginc 등 금지)
- Built-in 전용 매크로 사용 여부
UNITY_MATRIX_MVP,UnityObjectToClipPos등 금지
- URP 대체 함수 사용 여부 (예:
TransformObjectToHClip) TEXTURE2D/SAMPLER매크로 사용sampler2D직접 선언 여부 (금지)SAMPLE_TEXTURE2D계열 사용 적절성_MainTex_ST등 ST 처리 방식 적절성
- RenderGraph 연계
_CameraOpaqueTexture/_CameraDepthTexture접근 여부- Blit 기반 구조 전제 여부
- FullScreenPassRendererFeature 또는 외부 RendererFeature 의존 가능성
- 셰이더 파일만으로 확정 불가하면 "확인 필요"로 분리
- 프로젝트 규칙
- 저장소 내 셰이더 전용 규칙 파일(
.agents/rules/shader-urp.md)이 있으면 우선 적용 - 없으면 프로젝트 공통 규칙 + URP 17.x 표준 기준으로 판단
- C# 전용 규칙 / 분석기(CK Analyzer 등)를 셰이더에 그대로 적용하지 말 것
========================
[출력 형식]
- 전체 평가
- 즉시 사용 가능 / 수정 후 사용 가능 / 리젝 / 조건부 — (셋 중 하나)
- 한 줄 결론
- 이슈 목록
- Critical
- Major
- Minor
- Nice to Have
- 확인 필요
각 이슈는 아래 형식으로 작성:
- [치명도]
- 위치
- 문제
- 왜 위험한지
- 영향 GPU / API / 상황
- 수정 방향
- 수정 코드 (Before / After, 작을 땐 diff 허용)
- 수정 요약
- 필수 수정
- 권장 수정
- 총평
- 성능 총평
- 안정성 총평
- 호환성 총평
- 수정안 검증 방법
- before / after 스크린샷 비교
- Frame Debugger로 Pass 수 / Draw Call 변화 확인
- Variant 수 변화 확인 (
ShaderVariantCollection/ stripping 결과 포함) - RenderDoc 확인 필요 여부
- Android / iOS 실기 테스트 필요 여부
- 추가 확인이 필요한 시스템
- RendererFeature
- Script / MPB
- Material
- VariantCollection / Stripping 설정
- GPU Resident Drawer / BRG 사용 여부
- 기타
========================
[선택 출력: 점수]
점수는 보조 정보로만 사용. 판정과 필수 수정 항목을 우선할 것.
점수를 부여할 경우 각 항목에 감점 근거를 한 줄씩 적을 것.
가중치 근거: 모바일 실서비스 기준, 안정성과 성능을 최우선으로 둠.
총점: 100점
- 안정성: 30점
- GPU 호환성: 20점
- 성능: 30점
- 구조: 10점
- 유지보수성: 10점
출력:
- 각 항목 점수 (감점 근거 포함)
- 총점
- 한 줄 평가
========================
[대상 셰이더]
<<FILL: 대상 셰이더 코드 전문 또는 Read 결과를 붙여넣을 것. 경로만 주어진 경우 리뷰어가 직접 Read 후 진행>>
실서비스 투입 가능 여부를 빨리 가르는 용도. Critical/Major만 강하게 잡게 만드는 템플릿.
다음 Unity URP 셰이더를 빠르게 리뷰해줘.
목적:
모바일 URP 실서비스 기준에서
"지금 바로 넣어도 되는지" 빠르게 판정
환경:
- Unity 6000.3.9f1
- URP 17.3.0
- Mobile (Android / iOS)
- Vulkan / OpenGLES3 / Metal
- URP Forward ONLY
- RenderGraph 필수
- SRP Batcher 필수
- MSAA OFF / FXAA / HDR OFF / Linear
- 타겟 GPU: Mali / Adreno / PowerVR / Metal
입력:
- 대상 파일: [파일 경로]
- 리뷰 범위: 전체 파일
- 셰이더 유형: [Lit / Unlit / Outline / Stencil / Depth / Shadow / Utility]
- include 파일: [있으면 함께, 없으면 없다고 명시]
리뷰 원칙:
- 추상적 칭찬 금지
- Minor/Nice보다 Critical/Major 우선
- 셰이더 코드만으로 확정 불가한 항목은 "확인 필요"
- include 미제공이면 include 의존 판단은 "확인 필요"
핵심 체크:
- NaN / undefined
- divide by zero
- normalize(0)
- sqrt 음수
- pow/log 입력 범위
- 초기화되지 않은 값
- URP 구조
- Pass / LightMode 타당성
- Built-in include / CGPROGRAM 사용 여부
- SRP Batcher 깨는 패턴
- RenderGraph 전제 위반 징후
- 모바일 리스크
- 불필요한 variant
- 과한 texture sample
- discard / clip / transparent overdraw
- precision 혼용
- Vulkan / GLES / Metal 해석 차이 위험
출력 형식:
- 전체 평가
- 즉시 사용 가능 / 수정 후 사용 가능 / 리젝
- 한 줄 이유
- 이슈 목록
- Critical
- Major
- 확인 필요
각 이슈 형식:
- 위치
- 문제
- 왜 위험한지
- 영향 GPU/API/상황
- 수정 방향
- 수정 코드(diff, 가능하면)
-
필수 수정 요약
-
빠른 총평
- 안정성
- 호환성
- 성능
대상 셰이더:
[코드 또는 파일 경로]
GPU/API/URP 구조/SRP Batcher/RenderGraph 중심으로 검증하는 템플릿.
다음 Unity URP 셰이더를 호환성 중심으로 리뷰해줘.
목적:
모바일 실서비스에서 GPU/API/URP 구조 호환성 리스크를 검출
환경:
- Unity 6000.3.9f1
- URP 17.3.0
- Mobile (Android / iOS)
- Vulkan / OpenGLES3 / Metal
- URP Forward ONLY
- RenderGraph 필수
- SRP Batcher 필수
- MSAA OFF / FXAA / HDR OFF / Linear
- 타겟 GPU: Mali / Adreno / PowerVR / Metal
입력:
- 대상 파일: [파일 경로]
- 리뷰 범위: 전체 파일
- 셰이더 유형: [유형]
- 의도한 기능: [조명 / 그림자 / AlphaClip / 투명 / Depth 등]
- 직접 include하는 로컬 파일: [목록]
리뷰 우선순위:
- GPU / API 호환성
- URP 구조 / Pass / LightMode
- SRP Batcher / CBUFFER
- RenderGraph 연계
- 기존 Material / MPB / Script 영향
핵심 체크:
- GPU / API
- Vulkan / GLES / Metal 해석 차이
- precision 혼용
- 암묵적 캐스팅
- dynamic indexing / LUT / uniform array
- NaN / undefined의 드라이버 민감성
- Mali / Adreno / PowerVR / Metal 특수 리스크
- URP 구조
- HLSLPROGRAM 사용 여부
- CGPROGRAM / Built-in include 금지 위반 여부
- Pass / LightMode 정확성
- UniversalForward / UniversalForwardOnly 선택 타당성
- 불필요한 Pass 존재 여부
- SRP Batcher
- UnityPerMaterial CBUFFER 외부 프로퍼티
- 중복 선언
- 레이아웃 깨짐 가능성
- instancing property와 material property 경계 문제
- 키워드 / Variant
- 셰이더 역할 대비 필요한 키워드 누락 여부
- 불필요한 키워드 존재 여부
- FORWARDPLUS 존재 시 타당성
- shader_feature_local / multi_compile 선택 타당성
- RenderGraph / 연동
- CameraOpaqueTexture / CameraDepthTexture 접근 여부
- RendererFeature 의존 가능성
- Material / MPB / Script / stripping 설정 영향
- 셰이더만으로 확정 불가 시 "확인 필요"
출력 형식:
- 전체 평가
- 즉시 사용 가능 / 수정 후 사용 가능 / 리젝
- 이슈 목록
- Critical
- Major
- Minor
- 확인 필요
각 이슈 형식:
- 위치
- 문제
- 왜 위험한지
- 영향 GPU/API/상황
- 수정 방향
- 수정 코드(diff, 가능하면)
- 호환성 요약
- API 호환성
- GPU 호환성
- URP / RenderGraph 적합성
- SRP Batcher 적합성
- 추가 확인 필요 항목
- RendererFeature
- Material / MPB
- Script
- Variant / stripping
대상 셰이더:
[코드 또는 파일 경로]
모바일 성능 병목을 찾는 템플릿. ALU보다 bandwidth/overdraw/variant를 강하게 봄.
다음 Unity URP 셰이더를 최적화 중심으로 리뷰해줘.
목적:
모바일 URP에서 성능 병목이 되는 요소를 실전 기준으로 검출
환경:
- Unity 6000.3.9f1
- URP 17.3.0
- Mobile (Android / iOS)
- Vulkan / OpenGLES3 / Metal
- URP Forward ONLY
- RenderGraph 필수
- SRP Batcher 필수
- MSAA OFF / FXAA / HDR OFF / Linear
- 타겟 GPU: Mali / Adreno / PowerVR / Metal
입력:
- 대상 파일: [파일 경로]
- 리뷰 범위: 전체 파일
- 셰이더 유형: [유형]
- include 파일: [목록]
리뷰 우선순위:
- texture fetch / bandwidth
- overdraw / discard / AlphaClip
- variant / keyword 폭증
- register pressure / varying 수
- 불필요한 ALU / 중복 계산
핵심 체크:
- Texture / bandwidth
- texture sample 수
- 동일 텍스처 중복 샘플링
- SAMPLE 결과 재사용 누락
- Texture2DArray / dependent read 비용
- 불필요한 고해상도 텍스처 전제 여부
- Overdraw / AlphaClip / Transparent
- transparent overdraw 리스크
- ALPHATESTON aliasing / shimmer
- discard / clip의 early-z 저해
- TBDR GPU에서 비용 증가 가능성
- 필요 시 Pre-Z 고려 필요성
- Variant / keyword
- multi_compile 남용
- shader_feature_local로 줄일 수 있는지
- global keyword 낭비
- 셰이더 역할 대비 불필요 variant 존재 여부
- ALU / register / varying
- 비싼 수학 연산
- loop 내부 반복 계산
- 중간 변수 과다
- TEXCOORD / varying 과다
- normalize / pow / branch 남용
- 정밀도
- float를 half로 낮춰도 되는 부분
- 반대로 float가 필요한데 half로 위험한 부분
- 모바일 GPU에서 precision 안정성
출력 형식:
- 전체 평가
- 즉시 사용 가능 / 수정 후 사용 가능 / 리젝
- 한 줄 성능 판정
- 이슈 목록
- Critical
- Major
- Minor
- Nice to Have
- 확인 필요
각 이슈 형식:
- 위치
- 문제
- 왜 느린지 또는 위험한지
- 영향 GPU/API/상황
- 수정 방향
- 수정 코드(diff, 가능하면)
- 예상 개선 포인트
- sample 수 감소
- variant 감소
- overdraw 감소
- bandwidth 감소
- register pressure 완화
- 최적화 요약
- 필수 최적화
- 권장 최적화
- 성능 총평
- ALU
- Bandwidth
- Overdraw
- Variant
- 검증 방법
- Frame Debugger
- RenderDoc
- Mali / Adreno 실기 테스트
- before / after 스크린샷
- variant 변화 확인
대상 셰이더:
[코드 또는 파일 경로]