[TIL] 유니티 Shader 와 Shader Graph 맛보기

Dreamer·2024년 12월 20일
post-thumbnail

1. 오늘 배운 것

오늘은 Unity Korea에서 라이브로 올라온 알쓸유잡 2D Shader Graph를 보면서 정리한 내용이다.

https://www.youtube.com/watch?v=8-KkseDSXeI

Shader Graph 에 대한 튜토리얼 영상인데 아주 유용한 영상이었다.

2. 그래픽스 렌더링 파이프라인 기본 구성

  • Vertices (정점): 3D 공간 또는 2D 공간 상의 점들을 정의한다. 각 정점은 위치, 색상, UV 좌표 등의 정보를 가질 수 있다.
  • Edges (모서리): 정점들을 연결하는 선이다.
  • Polygons (다각형): 일반적으로 삼각형(Triangle)으로 구성되며, 3개의 정점과 3개의 모서리로 이루어진다. 3D 모델링의 기본 단위이다.
  • Mesh (메쉬): 여러 개의 다각형(일반적으로 삼각형)으로 이루어진 3D 객체의 표면을 나타내는 데이터 구조이다.

3. GPU와 데이터

  • GPU는 정점, 인덱스, 텍스처 등의 데이터를 처리한다.

  • Vertex Buffer: 정점 데이터를 저장한다. (예: 위치, 색상, UV)

  • Index Buffer: 정점들을 연결하여 삼각형을 만드는 순서를 정의한다. (예: 0, 1, 2, 2, 3, 0)

  • Render State: 삼각형을 그리는 방식을 정의한다. (예: Counter Clockwise, Triangle List)

  • Vertex Declaration: 정점 데이터의 구성을 정의한다. (예: Position, Color, UV)

4. 프레임을 렌더링 하는 과정

  1. Update: 게임 로직, 물리, 입력, 애니메이션 등을 처리한다.
  2. Cull:
    • Frustum Culling: 카메라 시야 밖에 있는 오브젝트를 렌더링 대상에서 제외한다.
    • Occlusion Culling: 다른 오브젝트에 가려져 보이지 않는 오브젝트를 렌더링 대상에서 제외한다.
  3. Scene Render (Draw Call): GPU에게 오브젝트를 그리라고 명령하는 단계이다. 각 Draw Call은 CPU 오버헤드를 발생시키므로, Draw Call 수를 줄이는 것이 성능 최적화에 중요하다.
    • Vertex Shader: 정점 데이터를 변형한다. (예: 위치 변환, 애니메이션 적용)
    • Rasterizer: 정점 데이터를 픽셀로 변환한다. (화면에 그릴 픽셀 결정)
    • Fragment Shader (Pixel Shader): 각 픽셀의 색상을 계산한다. (예: 텍스처 적용, 조명 계산)
  4. Post Processing: 화면에 렌더링된 이미지에 추가 효과를 적용한다. (예: 블룸, 색수차)
    • Vertex Shader, Fragment Shader를 사용한다.
  5. Back Buffer: 화면에 표시되기 전에 렌더링된 이미지가 저장되는 임시 버퍼이다.
  6. Front Buffer: 현재 화면에 표시되는 이미지가 저장된 버퍼이다.

  • Back Buffer와 Front Buffer를 번갈아 사용하며 화면을 부드럽게 업데이트하는 기술이다.
  • 오브젝트들이 렌더링 완료 후 한 번에 렌더링 결과를 Front Buffer와 교체하여 화면의 떨림(tearing) 현상을 방지한다.
  • 버퍼가 2개면 더블 버퍼링, 3개면 트리플 버퍼링 등이다. (게임 옵션에서 많이 나옴)

5. 셰이더와 Material

  • Material: 그래픽을 렌더링하는 데 필요한 모든 정보를 담고 있는 객체이다. (예: 텍스처, 색상, 셰이더) Shader와 똑같이 보면 안된다.
  • Shader: 렌더링 파이프라인의 특정 단계(Vertex Shader, Fragment Shader)에서 실행되는 프로그램이다. Material의 구성 요소 중 하나이다.
  • Shader Graph: 노드 기반으로 셰이더를 시각적으로 제작할 수 있는 툴이다.
  • Unlit Shader: 조명 계산을 하지 않는 셰이더이다.
  • Lit Shader: 조명 계산을 하는 셰이더로 Fragment Node에 Mask와 Normal 정보가 추가된다.
  • Simple Noise vs. Noise Texture: 셰이더에서 노이즈를 생성할 때, Simple Noise 노드보다 Noise Texture를 사용하는 것이 성능상 더 효율적이다.

6. 셰이더 관련 용어 및 개념

  • Draw Call: GPU에게 오브젝트를 그리라고 명령하는 단위이다. Draw Call 수를 줄이는 것이 성능 최적화에 중요하다. (모바일에서는 400개 이상은 성능 문제가 발생할 수 있다.)
  • Vector: 방향, 속도, 위치, 색상, UV 등 다양한 데이터를 표현하는 데 사용된다.
  • Normalize: 벡터의 길이를 1로 만드는 연산(단위화)이다. 셰이더에서 방향을 표현할 때 주로 사용된다.
  • UV: 메쉬에 이미지를 입히기 위한 2D 좌표 시스템이다. 2D에서도 Mesh를 사용하기에 적용된다.
  • Step Node: 셰이더 그래프 노드 중 하나로, Edge 값과 In 값을 비교하여 In이 Edge보다 크면 1, 작으면 0을 반환한다.
  • CameraSortingLayerTexture: 렌더링된 결과를 셰이더에서 텍스처로 사용할 수 있게 해주는 기능이다.
    • Renderer 설정에서 CameraSortingLayerTextureForemost Sorting LayerDisable하면 사용할 수 없다.
    • Bottom으로 설정하면 겹쳐있는 오브젝트 중 먼저 그려진 순서의 렌더링 결과를 가져올 수 있다.
  • 2D에서도 Mesh 사용: 2D 게임에서도 Sprite를 그릴 때 Mesh를 사용한다. Texture와 함께 위치에 맞게 Mesh에 그려준다.

7. 마무리

학습을 하다보니 내가 많은 걸 놓치고 있구 싶은 생각이다..
일단 셰이더로 할 수 있는 일들이 많이 있기 때문에 되도록이면 유니티 공식 자료에 있는 셰이더 부분은 모두 찾아보고 실습 해봐야겠다;;

profile
새로운 시작

0개의 댓글