
GPU가 POSITION 시멘틱으로 전달하는 데이터를, float4 타입의 positionOS 변수로 받겠다
시멘틱 = CPU(Unity)가 준비한 데이터를 GPU가 어떤 데이터인지 식별하는 라벨
┌─────────────────────────────────────────────────────────────────┐
│ SHADER 전체 구조 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 1. Shader 선언 │
│ Unity에서 이 셰이더를 찾을 수 있는 이름 정의 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 2. Properties │
│ Inspector에서 조절할 수 있는 설정값들 선언 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 3. SubShader │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Tags │ │
│ │ 이 셰이더가 언제, 어떻게 렌더링될지 Unity에 알려줌 │ │
│ │ (렌더 파이프라인/렌더 큐/렌더 타입) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Pass 설정 │ │
│ │ 실제 그리기 작업의 렌더링 옵션 설정 │ │
│ │ (블렌딩, 깊이, 컬링 등) │ │
│ │ │ │
│ │ 💡 위치에 따른 적용 범위: │ │
│ │ - SubShader에 두면: 모든 Pass에 기본값으로 적용 │ │
│ │ - Pass 안에 두면: 해당 Pass에만 적용 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ HLSLPROGRAM 시작 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ #pragma 지시문 │ │
│ │ 어떤 함수를 vert/frag로 쓸지 지정 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ #include │ │
│ │ Unity 기본 함수들 가져오기 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ struct Attributes │ │
│ │ 3D 모델에서 GPU로 들어오는 정점 데이터 구조 │ │
│ │ - 위치 (POSITION): 정점이 어디에 있는지 │ │
│ │ - 법선 (NORMAL): 빛 계산용 방향 │ │
│ │ - 텍스처 좌표 (TEXCOORD): 텍스처 이미지의 어느 지점인지 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ struct Varyings │ │
│ │ 정점 셰이더에서 픽셀 셰이더로 전달할 데이터 구조 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 변수 선언 (CBUFFER, TEXTURE2D 등) │ │
│ │ GPU에서 실제로 사용할 텍스처와 값들 선언 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Vertex Shader (vert 함수) │ │
│ │ 3D 모델의 정점 위치를 화면 좌표로 변환 │ │
│ │ 픽셀로 넘길 값(uv, normal 등)도 계산/세팅 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 🔧 래스터라이저 (자동 실행) │ │
│ │ 삼각형을 픽셀로 채우고 데이터 보간 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Fragment Shader (frag 함수) │ │
│ │ 각 픽셀의 최종 색상 계산해서 반환 │ │
│ │ - 텍스처 샘플링 │ │
│ │ - 색상 계산 │ │
│ │ - 조명, 이펙트 등 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ ENDHLSL / ENDCG │ │
│ │ HLSL 코드 블록 종료 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 4. 종료 │
│ HLSL 코드를 닫고 대체 셰이더 옵션 설정 │
│ (Fallback / CustomEditor 등) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 화면 출력 🎨 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 💡 핵심 개념 │
├─────────────────────────────────────────────────────────────────┤
│ 시맨틱 = "이 코드/값이 어떤 의미를 가지는가"를 정의하는 것 │
│ │
│ 정점 데이터 구조 = 한 정점이 가지고 있는 여러 속성 │
│ (위치, 노멀, UV 등)을 한 구조체로 묶은 것 │
└─────────────────────────────────────────────────────────────────┘
코드 해석방법
hlslfloat4 positionOS : POSITION;
"4개의 float으로 이루어진 positionOS라는 변수에, 메시의 정점 위치(POSITION) 데이터를 받겠다"