Pink Transparent Star

Shader

[ Shader ] 02.커스텀 쉐이더( Custom Shader ) 란?

채유나 2023. 5. 10. 01:51
728x90
해당 포스팅은 " 따라 하면서 배우는 유니티 5 셰이더와 이펙트 입문 " 기반으로 정리 하였습니다.

 

 

쉐이더 파일 생성 : Project - Assets 우클릭 - Create - Shader - Standard Surface Shader

 

유니티 쉐이더의 주 기능으로 쉐이더랩(Shader Lab)을 사용하며, 복잡한 기능에는 Cg를 사용한다.

 

쉐이더 스크립트 언어 : Cg, HLSL, GLSL, Shader Lab

 

Shader Lab 

: 유니티에서 사용하는 스크립트로 Shader Lab 기반으로 작성을 해야함

  고정 파이프라인 쉐이더 (fixed function shader)

  매우 가볍고 하드웨어 호환성이 좋지만 기능적으로 부족하다.

 

 

Shader Property

Properties
{
	_Color("Color", Color) = (1, 1, 1, 1)
}

Properties 블록 : 머터리얼에서 조절할 수 있는 슬라이더, 디퓨즈 텍스처, 정의된 색상 등 원시 머터리얼을 포함

                            큰따음표(" ")안에 문자는 Inspector뷰에 나올 프로퍼티 이름이다.

 

SubShader
{
	Pass
    {
        Color [_Color]
    }
}

SubShader 블록 : 모든 쉐이더에 하나 이상 포함

                             다른 쉐이더 정의를 분리하는 기능을 가지고 있으며 여러 장치에서 작동하게 만들 수 있다.

                             

 _MainTex : 주 텍스처 맵에 사용하는 표준 이름 / Albedo의 컴포넌트로 사용

Properties
{
	_MainTex("Albedo (RGB)",2D) = "white"{}
}

SubShader
{
	Pass
    {
        SetTexture[_MainTex]
        {
        	Combine Primary * Texture
        }
    }
}

 

Cg ( C for graphics )

: NVIDIA에서 개발한 상위 레벨 쉐이딩 언어

 

[ 전반적인 구성 ]

Shader "이름" {

Properties {

_프로퍼티("이름", 타입) = 값

}


Subshaders {

Tags {

// 유니티 프로퍼티
}

LOD 200


// 쉐이더 cg 코드

CGPROGRAM

#pragme surface surf Lambert

struct Input {

};



void surf( Input IN, inout SurfaceOutput o ) {

}

ENDCG

}

FallBack "Diffuese"

}

 

CGPROGRAM : Cg 블록의 시작

ENDCG : Cg 블록의 끝

- 실행 해야하는 코드는 두 코드 사이에 넣어줘야함

 

쉐이더 컴파일 지시자 ( Shader compilation directive )

: 스니핏(snippet) 이라고도 불려짐

: 전처리 부분 / 쉐이더의 여러 세팅 값 중에 미리 설정하는 부분

   #pragma surface surf Lambert

     : 컴파일 될 쉐이더 함수와 조명 모델을 지정

   #pragma surface surf Standard fullforwardshadows alpha

     : 쉐이더가 투명 컴포넌트를 컴파일

 

struct Input 
{
	float2 uv_MainTex;
}

sampler2D _MainTex; //텍스처
float4 _Color;

void surf(Input IN, inout SurfaceOutput o)
{
	o.Albedo = tex2D(_MainTex, IN.uv.MainTex).rgb * _Color.rgb;
}

Input 구조체 : 텍스처를 모델 표면에 올바르게 적용하기 위한 UV 데이터

                        Surface Shader Input Struct라고 불려진다.

                        uv_텍스처 변수명 으로 짓는 규칙이 있다.  

  - float2 : UV 데이터는 float 값 두 개로 구성

sampler2D : 텍스처의 자료형

    [ float를 이용하여 텍스처를 매핑할 수 없는 이유 ]

        1) 입력할 텍스처 

        2)  UV좌표

      2가지 정보를 이용하여 텍스처를 매핑하기 때문에 float로는 매핑하기 어려움

float4 : R,G,B,A 채널 값으로 구성

void surf(Input IN, inout SurfaceOutput o) : 변수 o로 지정한 입력 데이터를 조합해 쉐이더 출력

      - struct Input의 변수는 Input IN부분과 연동되어 surf 함수 내 IN. 으로 struct Input 변수로 접근하여 사용할 수 있다.

  - tex2D : 해당 함수에 sampler2D변수와 해당 텍스처의 Input.UV변수를 넣으면 이에 해당하는 float4(RGBA)값을 가짐

 

 

728x90