유니티 쉐이더 기본

그래픽스꿀잼·2026년 3월 30일

그래픽스

목록 보기
1/20

vertex / fragment

raterization 래스터화 픽셀화

디스플레이에 출력하는 방식은 2가지가 존재함

벡터, 래스터
벡터는 수학식을 이용해서 선으로 출력을 하는거고
래스터는 픽셀을 이용해서 필요한 부분에 알맞은 색상을 쏘는거임

먼저 모델이 있음
2D, 3D등 다양함

얘네들을 디스플레이에 어떻게 출력하냐
정점계산, 가중치를 이용한 AA(안티 앨리어싱)등을 사용함

이런 단계를 거침
정점을 계산 -> 각 정점이 어떻게 연결되어있는지 계산(UV등) -> 래스터화(픽셀화) -> 조각단위로 계산 -> 버퍼를 통해 컬러, 깊이(normal)등을 이용하여 출력

vertex

3D 모델의 정점 데이터를 받아 모델, 뷰, 투영 행렬을 적용해 화면상의 클립 공간(2D위치)으로 정점을 변환
버텍스 애니메이션(물결 효과 등)에 사용


이런 노드로 구성되어있음
Position 위치, Normal 법선, Tangent 접선

Position : 오브젝트의 좌표
Normal : 오브젝트의 한 면에 직각인 선분(외적)
Tangent : 오브젝트의 UV중 U(가로)에 평행한 선분

fragment

래스터라이저가 버텍스 사이를 보간하여 전달한 픽셀 정보를 받아 최종적인 픽셀 색상을 계산

이런식으로 구성되어있는데
어떤 종류의 머티리얼을 사용하냐에 따라 달라지므로
필요할때 하나씩 공부

쉐이더 기본 자료형

float

  • 고 정밀도
  • 일반적으로 월드 공간 포지션, 텍스처 좌표 또는 삼각법이나 제곱/지수연산 같은 복합 함수를 수반하는 스칼라 계산에 유용
  • used for world position, texture coordinate and math calcs

half

  • 중 정밀도
  • 짧은 벡터, 방향, 오브젝트 공간 포지션, 높은 동적 범위 컬러 등에 사용(HDR)
    • HDR(High Dynamic Range)은 픽셀의 밝기 값을 기존 0~1 범위를 넘어선 1 이상의 강도까지 표현하여, 실제 환경에 가까운 밝고 선명한 라이팅과 강렬한 블룸(Bloom) 효과를 구현하는 렌더링 기술

fixed

  • 저 정밀도
  • OpenGL ES 2.0 Graphics API에서만 지원
  • 다른 API에서는 지원되는 정밀도가 가장 낮아짐
  • 일반적인 컬러, 간단한 컬러작업 수행에 사용

int

  • 반복문 카운터나 배열 인덱스로 사용됨

텍스쳐 자료형

샘플러란...
모델의 표면에 텍스처(이미지)를 입힐 때, 텍스처의 어느 픽셀(텍셀, Texel)을 어떤 방식으로 가져와서 화면에 보여줄지 결정하는 역할

sampler 2D

  • 2d 텍스쳐를 위한 샘플러

sampler 3D

  • 3d 텍스쳐를 위한 샘플러

sampler cube

  • 큐브맵 텍스쳐를 위한 샘플러

각 샘플러는 정밀도를 위한 자료형을 가질 수 있음

이런식으로 ㅇㅇ

packed arrays

위의 데이터 타입을 이용해서 배열을 만들 수 있음


이런식으로 자료형 뒤에 길이에 해당되는 숫자를 붙이면 됨

fixed4 color1 = (1,1,1,1)
이런식으로 ㅇㅇ

color1.r = 1
color1.x = 1
이런식으로 수정도 가능함
RGBA, XYZW임

fixed4 color1 = (0,1,1,0);
fixed3 color2 = color1.rgb;
fixed3 color3 = color1.xyz;

//swizzle
fixed2 color4 = color1.ga;
fixed3 color5 = color1.gab;

//smearing
fixed3 color6 = 1
fixed3 color7 = (1,1,1) //위 아래 동일

packed matrix

빛을 다루기 때문에
많은 행렬연산이 필요함
그래서 그에 따른 행렬 자료형도 존재함

행렬은 그냥 2차원배열 ㅇㅇ

fixed4x4 m
fixed, float같은 자료형이 먼저 오고
행x열로 표현함

fixed v = m._m13
이런식으로 값을 찾을때는
._m00으로 행,열 순서대로 인덱스 입력해 찾음

fixed4 color = m._m01_m02_m03_m04;
이런식으로 값을 나열해서 가져올수도 잇음

fixed4 color2 = m[0]
이런식으로 행렬의 행 전체를 가져와서 사용할 수도 있음

유니티 쉐이더 그래프 자료형

이렇게 존재함
single은 float에 완벽하게 매핑되는 자료형임

GPU에 사용되는 32비트 부동소수점 자료형임
콘솔, 모바일이면 해당 기기의 사양에 32비트가 아닐 수 있음

half는 half랑 똑같음
16비트 ㅇㅇ
마찬가지로 콘솔, 모바일이면 플랫폼에 따라 크기가 다를수 있음

vertex/fragment의 실행횟수

vertex노드는
각 꼭지점에 대해 딱 한번만 실행된다

fragment노드는
잠재적 픽셀의 갯수만큼 실행된다
한 삼각형 면에 50개의 픽셀이 있으면 50번 실행되는거임ㅇㅇ


Custom Function노드

그냥 커스텀 쉐이더 노드임


이런식으로 input과 output을 이용해 커스텀 노드를 작성하는거임

UV / Texture

texture

texture는 바로 색상에 매핑을 못함
그러니 sampling을 한다음 매핑해줘야함

그게 texture2D파라미터와 Sample Texture 2D파라미터임
(무조건 2D인건 아님;;)

uv

UV는 대체 뭐임?
그냥 U = Width-Horizon, V = Height-Vertical

가로 세로임

텍스쳐가 평면에 매핑이 될때

이처럼 각 버텍스가 매핑되는 거임


UV의 각 꼭짓점 좌표는 무조건 정규화되어서
0,0~1,1까지 이어짐

UV는 반시계방향 좌표(CCW, 오른손좌표계)임
이에 따라 앞면, 뒷면 렌더링이 결정되게 됨

만약 텍스쳐의 좌측상단 절반만큼만 텍스쳐로 이용하고 싶으면

이렇게 (0, 0.5)좌표에서 X,Y로 각 0.5씩만 이동되도록 하면 됨(/2)

또 드로우콜(gpu에서 렌더링 하는 횟수)를 줄이려면
텍스쳐 아틀라스를 사용하면 됨

이런식으로 각 좌표를 n개의 정사각형(대개 2의 n배수)로 나눠서 1/n의 좌표를 가지는 식으로 처리하기도 함

profile
그래픽스 공부중

0개의 댓글