본문으로 건너뛰기
CHOI HONGSU
1 min read

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 사용.

========================

[핵심 체크리스트]

  1. 안정성 / Undefined / NaN
  • divide by zero
  • normalize(0)
  • sqrt 음수
  • atan2(0,0)
  • pow/log 입력 범위
  • NaN / INF 전파 가능성
  • 초기화되지 않은 값 사용 가능성
  • Linear 환경에서 잘못된 감마/리니어 수동 변환 존재 여부
  1. 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): 드라이버 버전별 이슈 다수
  1. 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 키워드 정합성
  1. SRP Batcher
  • CBUFFER_START(UnityPerMaterial) 외부에 머티리얼 프로퍼티 선언 여부
  • 동일 프로퍼티 중복 선언
  • instancing property와 material property 경계 문제
  • UnityPerMaterial 레이아웃 깨짐 가능성
  • GPU Resident Drawer 사용 시 UnityPerMaterial 정렬/크기 제약 준수 여부
  • SRP Batcher 비호환 패턴 존재 여부
  1. 키워드 / Variant
  • 셰이더의 의도된 기능 범위 기준으로 필요한 키워드만 평가
  • 필요한 키워드 누락 여부
  • 불필요 키워드 / variant 과다 여부
  • Forward ONLY 프로젝트에서 _FORWARD_PLUS 존재 시 타당성 검토
  • shader_feature_local / shader_feature / multi_compile 사용 구분 적절성
  • global keyword 낭비 가능성
  • DOTS_INSTANCING 대응 필요 시 multi_compile _ DOTS_INSTANCING_ON 누락 여부
  1. 성능
  • texture fetch 수
  • 동일 텍스처 중복 샘플링 / 샘플 결과 재사용 누락
  • branch / loop 비용
  • 비싼 수학 연산 (pow, exp, log, trig, sqrt)
  • bandwidth 병목 가능성 (모바일 최우선 지표)
  • Texture2DArray / dependent read 비용
  • varying 수 과다 여부
  • register pressure 가능성
  • 중간 변수 / loop 내부 계산 과다 여부
  • half 적극 활용으로 줄일 수 있는 구간 존재 여부
  1. AlphaClip / Transparent / Overdraw
  • MSAA OFF + FXAA 환경에서 edge 품질 문제
  • _ALPHATEST_ON aliasing / shimmer / temporal instability
  • discard / clip 사용 시 플랫폼별 영향 분리
    • TBDR (PowerVR / Apple): HSR 무력화 → 페널티 큼
    • IMR / Tile-Based IMR (Mali / Adreno): early-z 지연, 페널티 상대적으로 작음
  • Transparent overdraw 비용
  • 필요 시 Pre-Z (DepthPrepass) 고려 여부

========================

[보조 체크리스트]

  1. ShaderLab 메타
  • Tags 정합성
    • RenderType / Queue / RenderPipeline="UniversalPipeline" / IgnoreProjector
  • LOD 적절성
  • FallBack 사용 여부
  • CustomEditor 필요성
  • #pragma target / #pragma require 과도 여부 및 근거
  1. 헤더 / 문법 / 샘플링 스타일
  • 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 처리 방식 적절성
  1. RenderGraph 연계
  • _CameraOpaqueTexture / _CameraDepthTexture 접근 여부
  • Blit 기반 구조 전제 여부
  • FullScreenPassRendererFeature 또는 외부 RendererFeature 의존 가능성
  • 셰이더 파일만으로 확정 불가하면 "확인 필요"로 분리
  1. 프로젝트 규칙
  • 저장소 내 셰이더 전용 규칙 파일(.agents/rules/shader-urp.md)이 있으면 우선 적용
  • 없으면 프로젝트 공통 규칙 + URP 17.x 표준 기준으로 판단
  • C# 전용 규칙 / 분석기(CK Analyzer 등)를 셰이더에 그대로 적용하지 말 것

========================

[출력 형식]

  1. 전체 평가
  • 즉시 사용 가능 / 수정 후 사용 가능 / 리젝 / 조건부 — (셋 중 하나)
  • 한 줄 결론
  1. 이슈 목록
  • Critical
  • Major
  • Minor
  • Nice to Have
  • 확인 필요

각 이슈는 아래 형식으로 작성:

  • [치명도]
  • 위치
  • 문제
  • 왜 위험한지
  • 영향 GPU / API / 상황
  • 수정 방향
  • 수정 코드 (Before / After, 작을 땐 diff 허용)
  1. 수정 요약
  • 필수 수정
  • 권장 수정
  1. 총평
  • 성능 총평
  • 안정성 총평
  • 호환성 총평
  1. 수정안 검증 방법
  • 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 의존 판단은 "확인 필요"

핵심 체크:

  1. NaN / undefined
  • divide by zero
  • normalize(0)
  • sqrt 음수
  • pow/log 입력 범위
  • 초기화되지 않은 값
  1. URP 구조
  • Pass / LightMode 타당성
  • Built-in include / CGPROGRAM 사용 여부
  • SRP Batcher 깨는 패턴
  • RenderGraph 전제 위반 징후
  1. 모바일 리스크
  • 불필요한 variant
  • 과한 texture sample
  • discard / clip / transparent overdraw
  • precision 혼용
  • Vulkan / GLES / Metal 해석 차이 위험

출력 형식:

  1. 전체 평가
  • 즉시 사용 가능 / 수정 후 사용 가능 / 리젝
  • 한 줄 이유
  1. 이슈 목록
  • Critical
  • Major
  • 확인 필요

각 이슈 형식:

  • 위치
  • 문제
  • 왜 위험한지
  • 영향 GPU/API/상황
  • 수정 방향
  • 수정 코드(diff, 가능하면)
  1. 필수 수정 요약

  2. 빠른 총평

  • 안정성
  • 호환성
  • 성능

대상 셰이더:
[코드 또는 파일 경로]

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하는 로컬 파일: [목록]

리뷰 우선순위:

  1. GPU / API 호환성
  2. URP 구조 / Pass / LightMode
  3. SRP Batcher / CBUFFER
  4. RenderGraph 연계
  5. 기존 Material / MPB / Script 영향

핵심 체크:

  1. GPU / API
  • Vulkan / GLES / Metal 해석 차이
  • precision 혼용
  • 암묵적 캐스팅
  • dynamic indexing / LUT / uniform array
  • NaN / undefined의 드라이버 민감성
  • Mali / Adreno / PowerVR / Metal 특수 리스크
  1. URP 구조
  • HLSLPROGRAM 사용 여부
  • CGPROGRAM / Built-in include 금지 위반 여부
  • Pass / LightMode 정확성
  • UniversalForward / UniversalForwardOnly 선택 타당성
  • 불필요한 Pass 존재 여부
  1. SRP Batcher
  • UnityPerMaterial CBUFFER 외부 프로퍼티
  • 중복 선언
  • 레이아웃 깨짐 가능성
  • instancing property와 material property 경계 문제
  1. 키워드 / Variant
  • 셰이더 역할 대비 필요한 키워드 누락 여부
  • 불필요한 키워드 존재 여부
  • FORWARDPLUS 존재 시 타당성
  • shader_feature_local / multi_compile 선택 타당성
  1. RenderGraph / 연동
  • CameraOpaqueTexture / CameraDepthTexture 접근 여부
  • RendererFeature 의존 가능성
  • Material / MPB / Script / stripping 설정 영향
  • 셰이더만으로 확정 불가 시 "확인 필요"

출력 형식:

  1. 전체 평가
  • 즉시 사용 가능 / 수정 후 사용 가능 / 리젝
  1. 이슈 목록
  • Critical
  • Major
  • Minor
  • 확인 필요

각 이슈 형식:

  • 위치
  • 문제
  • 왜 위험한지
  • 영향 GPU/API/상황
  • 수정 방향
  • 수정 코드(diff, 가능하면)
  1. 호환성 요약
  • API 호환성
  • GPU 호환성
  • URP / RenderGraph 적합성
  • SRP Batcher 적합성
  1. 추가 확인 필요 항목
  • 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 파일: [목록]

리뷰 우선순위:

  1. texture fetch / bandwidth
  2. overdraw / discard / AlphaClip
  3. variant / keyword 폭증
  4. register pressure / varying 수
  5. 불필요한 ALU / 중복 계산

핵심 체크:

  1. Texture / bandwidth
  • texture sample 수
  • 동일 텍스처 중복 샘플링
  • SAMPLE 결과 재사용 누락
  • Texture2DArray / dependent read 비용
  • 불필요한 고해상도 텍스처 전제 여부
  1. Overdraw / AlphaClip / Transparent
  • transparent overdraw 리스크
  • ALPHATESTON aliasing / shimmer
  • discard / clip의 early-z 저해
  • TBDR GPU에서 비용 증가 가능성
  • 필요 시 Pre-Z 고려 필요성
  1. Variant / keyword
  • multi_compile 남용
  • shader_feature_local로 줄일 수 있는지
  • global keyword 낭비
  • 셰이더 역할 대비 불필요 variant 존재 여부
  1. ALU / register / varying
  • 비싼 수학 연산
  • loop 내부 반복 계산
  • 중간 변수 과다
  • TEXCOORD / varying 과다
  • normalize / pow / branch 남용
  1. 정밀도
  • float를 half로 낮춰도 되는 부분
  • 반대로 float가 필요한데 half로 위험한 부분
  • 모바일 GPU에서 precision 안정성

출력 형식:

  1. 전체 평가
  • 즉시 사용 가능 / 수정 후 사용 가능 / 리젝
  • 한 줄 성능 판정
  1. 이슈 목록
  • Critical
  • Major
  • Minor
  • Nice to Have
  • 확인 필요

각 이슈 형식:

  • 위치
  • 문제
  • 왜 느린지 또는 위험한지
  • 영향 GPU/API/상황
  • 수정 방향
  • 수정 코드(diff, 가능하면)
  • 예상 개선 포인트
    • sample 수 감소
    • variant 감소
    • overdraw 감소
    • bandwidth 감소
    • register pressure 완화
  1. 최적화 요약
  • 필수 최적화
  • 권장 최적화
  1. 성능 총평
  • ALU
  • Bandwidth
  • Overdraw
  • Variant
  1. 검증 방법
  • Frame Debugger
  • RenderDoc
  • Mali / Adreno 실기 테스트
  • before / after 스크린샷
  • variant 변화 확인

대상 셰이더:
[코드 또는 파일 경로]