본문 바로가기

Game/Unity & C#

unity shader foundation

유니티 쉐이더

  • ShaderLab(쉐이더랩)이라고 불리는 자체 스크립트 언어를 사용하고 있다.

    • 쉐이더는 모바일-PC-콘솔기기 등 플랫폼별, 그리고 그림자 유무-라이트 맵 유무 등 다양한 경우의 수에 따라 제작방법이 다르다. 이를 편하게 사용하기 위해 유니티의 쉐이더랩 스크립트가 있는 것이다. (하나만 작성하면 모두 대응)

  • 쉐이더랩을 이용한 제작 방식은 크게 세 가지로 나뉜다.

    1) 쉐이더랩으로만 작성하기 (fixed function shader)

    • 매우 가볍고 하드웨어 호환성이 좋지만, 기능이 상당히 부족해 고급 효과를 기대하긴 어렵다.

    • 자체 문법으로 이루어져 있어서 다른 쉐이더와 호환되지 않는다.

    • 지원 중단 수순을 밟는중 추천 X.

    2) Surface Shader로 작성하기

    • 쉐이더랩 스크립트와 함께 일부분은 CG 쉐이더 코드를 사용하는 방법이다.

    • 기본적인 조명-버텍스 쉐이더의 복잡한 부분은 스크립트를 이용해 자동으로 처리된다.

    • 픽셀 쉐이더 부분만 간편하게 작성할 수 있어서 편하다.

    • 비주얼 쉐이더 에디터와도 상당히 비슷한 개념을 가지고 있어서 초보자가 공부하기에 좋고 응용하기에도 좋다.

    • 최적화에는 다소 무리가 있고, 일정 수준 이상의 고급 기법을 구현하기는 어렵다.

    3) Vertex & Fragment Shader로 작성하기

    • 쉐이더랩 스크립트와 함께 CG 쉐이더 코드를 사용하지만, 좀 더 본격적인 쉐이더 작성 방법이다.

    • 자동으로 처리해주는 부분이 별로 없어서 제대로 된 CG 쉐이더 방식으로 정점의 좌표 변환부터 제대로 처리해야 작동한다.

    • 배우기는 힘들지만, 완전히 수동으로 제어할 수 있어서 최적화와 고급 기법을 표현할 때 좋다.

  • 쉐이더랩 문법

    • _Name

      : 이 기능의 변수명이다. _를 붙이는 것이 필수는 아니지만, 외부에서 받았다는 것을 표시하기 위해 자주 쓴다.

    • "diplay name"

      : 큰 따옴표 안에 쓰는 글은 순수하게 '화면에 나타나는'글자이다. 엔진에서는 이 안의 내용을 순수한 글씨로 인식한다.

    • tex2D

      : float 계열로 분류되지 않는 sampler 들이다. 텍스처는 UV 좌표와 함께 계산되어야 float4로 출력될 수 있기 때문에, 아직 UV와 계산되지 않은 텍스처는 색상(float4)으로 나타낼 수 없다. 그래서 이때까지는 sampler라고 부른다. 그 중 tex2D는 2D 텍스처를 받는 인터페이스를 만들어 준다.

    • struct SurfaceOutputStandard

      {

      fixed3 Albedo; // 반사율 (기본 색상 / 오브젝트의 텍스쳐)

      fixed3 Normal; // 법선 (반사각을 결정하는 면의 방향)

      fixed3 Emission; // 방사 (이 오브젝트가 스스로 생성하는 빛의 양)

      half Metallic;

      half Smoothness;

      half Occlusion; // 폐색

      half Alpha;

      };

      glossiness -> 광택 (스펙큘러 반사가 퍼지는 정도)

      gradient -> 기울기?

      Specular -> 머터리얼이 빛을 반사하는 정도 (0~1)