유니티 쉐이더 작성

ShaderLab으로만 작성

  • ShaderLab 문법만 이용해서 작성하는 방법
  • 장점: 매우 가볍고 하드웨어 호환성이 좋음
    단점: 기능이 부족하며 자체 문법으로 이루어져 있어, 다른 쉐이더 문법과 거의 호환되지 않음. 고급 기법 구현 불가

Surface Shader로 작성

  • ShaderLab 스크립트와 함께 일부분은 CG 쉐이더 코드를 사용
  • 장점: 조명과 버텍스 쉐이더의 복잡한 부분은 스크립트가 자동 처리하며 픽셀 쉐이더 부분만 간편하게 작성할 수도 있어서 편리함.
    단점: 최적화에 무리가 있으며 일정 수준 이상의 고급 기법은 구현 불가

Vertex & Fragment Shader로 작성

  • ShaderLab 스크립트와 CG 쉐이더 코드를 모두 사용하며 보다 본격적인 쉐이더 작성 방법
  • 제대로 된 CG 쉐이더 방식으로 버텍스의 좌표 변환부터 제대로 처리해야 작동
  • 장점: 최적화와 고급 기법 표현에 유리

렌더링 파이프라인( Rendering Pipeline:렌더링 순서)


  • 오브젝트 데이터 받아오기
    • 그래픽 카드는 버텍스(Vertex)으로 이루어진 물체의 데이터 값을 받아옴.
    • -> 그래픽 카드 내부의 값으로만 존재하는 데이터
    • 버텍스는 Index number, Position, Normal, Color, UV 등의 정보를 가짐.
    • 그래픽 카드는 버텍스의 정보들을 통하여 삼각형 면을 생성하여 오브젝트의 기본적인 형태를 갖춘 후, 이를 버텍스 쉐이더로 넘길 준비를 함.

 

  • 정점(Vertex) 쉐이더
    • 데이터들을 활용한 본격적인 쉐이딩 작업의 첫 번째 과정
    • 좌표 변환
      • 버텍스는 물체가 가지고 잇는 '자기중심적인' 위치 값을 의미하는 로컬(Local) 좌표계 상태
      • -> 오브젝트별로 가지고 있는 본인의 피봇이 0,0,0 위치값, 즉 중심값인 상태
      • _'원드 변환 행렬(월드 좌표계)'_을 곱해주어 월드 좌표계로 변환
      • -> 절대 좌표인 월드 좌표계의 위치로부터 각 물체의 상대적 위치 값 표현
      • _'카메라 행렬'_을 곱하여 원드 좌표계상의 오브젝트 버텍스 위치 값들을 카메라 중심점으로부터의 상대적 거리로 변환
        🔑 카메라 행렬 = 뷰(View) = 오쏘그래픽 프로젝션(Orthographic Projection)
      • 다시 _'프로젝션(Projection) 행렬'_로 곱하여 원근감 표현
    여기까지 작업을 그대로 모니터에 출력하면? 텍스쳐, 음영, 라이트 무엇도 없는 그냥 폴리곤 덩어리가 생성된다. 말 그대로 모니터로 볼 수도 없는 단지 3D 공간에서 존재하는 오브젝트일 뿐이다.

 

  • 래스터라이저(Rasterizer)
    • Rasterizer : 이 오브젝트가 모니터에서 표현될 때 어느 픽셀로 표현될 것인지를 나타내는 장치
    • 래스터화 : 3D 오브젝트를 모니터에 보이도록 '픽셀'로 변환하는 과정

 

  • 픽셀 쉐이더(Pixel Shader)

'한 픽셀의 색을 결정하는 코드'

모니터까지 넘어온 3D 그래픽 데이터는 본격적으로 화면에 픽셀로 찍히게 되는데, 아직 텍스쳐와 라이팅은 없는 상태임. 여기에서 픽셀 쉐이더가 가동되며 조명과 텍스쳐, 그림자와 각종 특수효과 등을 연산함.

 

 

 

색과 빛의 기본 원리


  • 가산혼합: RGB(Red, Green, Blue)로 이루어진 색을 더하면 더할수록 밝아지며, 모두 더하며녀 흰색이 되는 색의 체계
  • 일반적인 컬러 모니터는 RGB로 구성된 3개의 서브 픽셀로 이루어짐.
💡'3D 컴퓨터 그래픽에서 최종적으로 화면에 출력하는 픽셀의 색을 정해주는 함수'
💡'그래픽 데이터의 음영과 색상을 계산하여 다양한 재질을 표현하는 방법'
유니티 엔진에서는 '쉐이더(Shader)', 언리얼 엔진에서는 '메터리얼(Material)'

+ Recent posts