250323

lililllilillll·2025년 3월 23일

개발 일지

목록 보기
119/350

✅ What I did today


  • Udemy Course : Unity Shader


🎞️ Udemy Course : Unity Shader


Shader "Holistic/BumpDiffuse"
{
    Properties {
        _myDiffuse ("Diffuse Textuire", 2D) = "white" {}
        _myBump ("Bump Texture", 2D) = "bump" {}
        _mySlider ("Bump Amount", Range(0,10)) = 1
        _mySlider2 ("Bump Texture Scale", Range(0,10)) = 1
    }
    SubShader {
        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _myDiffuse;
        sampler2D _myBump;
        half _mySlider;
        half _mySlider2;

        struct Input {
            float2 uv_myDiffuse;
            float2 uv_myBump;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo = tex2D(_myDiffuse, IN.uv_myDiffuse).rgb;
            o.Normal = UnpackNormal(tex2D(_myBump, IN.uv_myBump * _mySlider2));
            o.Normal *= float3(_mySlider, _mySlider, 1);
        }

        ENDCG
    }
    Fallback "Diffuse"
}
  • Lambert : 광원을 향한 벡터와 법선 벡터의 각도 차이로 빛 계산. 각도 작으면 빛 많이 받고, 크면 빛 적게 받음.
  • 노말맵의 rgb값은 x,y,z에 대응된다. x,y는 평면의 x,y, z는 노말 벡터를 표현.

Illumination Models

  • Flat : 폴리곤 별로 normal을 하나로 합쳐 계산
  • Gouraud : 폴리곤별로 vertex별 normal을 interpolate하여 계산
  • Phong : 픽셀별로 vertex별 normal을 interpolate하여 계산
  • 유니티는 기본으로 Phong 사용하지만, Model Import Settings에서 Normal을 Calculate로 바꾸고 Smooth Angle을 0으로 줄이면 Flat해짐 (라고는 하는데 직접 해보니까 안 flat 해짐)

gpt 추가 질문

개념

전체 흐름

Shader
 └── Properties         ← 사용자 입력값 정의 (텍스처, 색 등)
 └── SubShader          ← 실제 쉐이더 코드 블록
     └── CGPROGRAM      ← HLSL/Cg 코드 작성 공간
         └── #pragma surface ← 이 쉐이더의 성격 설정
         └── Input / surf()  ← 텍스처 샘플링, 표면 정보 결정
     └── ENDCG
 └── Fallback           ← 이 쉐이더가 안 될 때 대체할 것

Surface Shader

  • Unity Built-in render pipeline 전용 추상화 시스템
  • Unity가 자동으로 라이트 계산, 그림자, 라이트맵 등을 다 처리해준다
  • 개발자는 surf() 함수만 작성하면 나머지는 Unity가 채워준다.

Surface Shader에서 채워야 하는 것들

  • void surf(Input IN, inout SurfaceOutput o)
  • IN : Unity가 자동으로 채워주는 입력값들 (UV, worldPos 등)
  • o : 직접 설정한 표면 결과 (Albedo, Normal 등)

문법

SubShader

  • 쉐이더의 구현이 들어가는 블록
  • 하나의 쉐이더 안에 여러 SubShader 넣을 수 있다
  • 그래픽 카드 성능이나 플랫폼에 따라 SubShader 자동 선택
  • 일종의 "플랜 A / 플랜 B / 플랜 C" 같은 역할

CGPROGRAM ~ ENDCG

  • 이 사이만 실제 쉐이더 코드로 인식된다
  • CGPROGRAM은 "Cg 언어 프로그램"의 줄임말, 옛날에 쓰던거고, 지금은 HLSL로 컴파일됨.

#pragma

  • 컴파일러에게 쉐이더 정보 알려주는 지시어
  • surface surf : surf 함수가 이 쉐이더의 surface 함수다
  • Lambert : 조명 모델은 Lambert다

surface

  • 표면의 재질 정보를 정의하는 함수
  • Unity가 각 픽셀마다 해당 함수 호출해서 Albedo, Smootheness, Normal 등 결정
  • SurfaceOutput 구조체는 Unity가 조명 계산에 쓰는 표면 정보들 담고 있음

Fallback

  • 해당 쉐이더가 지원되지 않을 때, 대신 쓸 기본 쉐이더

자료형

  • in : 읽기 전용. 값 받아서 읽기만 가능.
  • out : 쓰기 전용. 함수 내부에서 초기화해서 밖으로 전달.
  • inout : 읽기 + 쓰기. 받아온 값 수정해서 돌려보냄.


profile
너 정말 **핵심**을 찔렀어

0개의 댓글