본문 바로가기

유니티 쉐이더 스타트업

[ 유니티 쉐이더 스타트업 ] 04 . 쉐이더랩에 관하여

[ 쉐이더 랩 ]

[ 쉐이더랩]

https://docs.unity3d.com/kr/530/Manual/SL-Shader.html

 

ShaderLab 구문 - Unity 매뉴얼

Unity의 모든 셰이더 파일은 “ShaderLab”이라는 선언형 언어로 작성되어 있습니다. 이 파일에서 중첩 중괄호 구문은 셰이더를 서술하는 다양한 요소를 선언합니다. 예를 들어, 어떤 셰이더 프로퍼

docs.unity3d.com

유니티 쉐이더의 자체 스크립트 언어를 쉐이더랩이라고 한다 .

다양한 경우의 분기를 쉐이더랩이 자동을 작성해줌으로

사용자는 쉐이더랩의 문법에 맞추어 하나의 쉐이더만 작성하면 된다.


 

 

[ 제작방식의 종류 ]

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

  • ShaderLab (쉐이더랩)으로만 작성하기
  • Surface Shader (서피스 쉐이더)로 작성하기
  • Vertex & Fragment Shader (버텍스 & 프라그먼트 쉐이더)로 작성하기

 

[ ShaderLab으로만 작성하기 ]

  • 고정 파이프라인 쉐이더 : Fixed function shader

Shader Lab 문법만 사용하여 작성하는 방법이다 .

 

가볍고 , 하드웨어 호환성이 좋지만 기능이 상당히 부족하여 고급효과를 기대 할 수는 없다 .

자체 문법으로 이루어져 다른 쉐이더 문법과 거의 호환되지 않는 단점을 가지고 있다 .

해당 방식은 지원 중단 수순을 밟고 있다 .

Shader "VertexLit"{
	Properties{
    	_Color ("Main Color",color) = (1,1,1,0.5)
        _SpecColor ("SpecColor", Color) = (1,1,1,1)
        _Emission("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range(0.01,1)) = 0.7
        _MainTex ("Base (RGB)",2D ) ="White" {}
 	}
    
    SubShader {
    	Pass{
        	Material {
            	Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emisison]
            }
            Lighting On
            SeparateSpecular On
            SetTexture [_MainTex]	{
            	constantColor [_Color]
                Combine texture * primary DOUBLE,texture *constant
                }
            }
        }
    }

 

 

  • 서피스 쉐이더 : Surface shader

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

CG 문법에 관하여

 

기본적인 조명 코드버텍스 쉐이더의 복잡한 부분은 스크립트를 이용하여 자동으로 처리되고 ,

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

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

단, 최적화에는 무리가 있고 , 일정 수준 이상의 고급 기법을 구현하기는 어려운 면도 있다 .

 

Shader "Example/Diffuse Simple"{
	SubShader{
    	Tags {"RenderType" = "Opaque"}
        CGPROGRAM
        #pragma surface surf Lambert
        struct Input{
        	float4 color : COLOR;
        };
        void surf (Input IN,inout Surfaceoutput o)	{
        	o.Albedo =1;
        }
        ENDCG
    }
    Fallback"Diffuse"
}

 

 

  • Vertex & Fragment Shader

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

자동으로 처리하는 부분이 별로 없어 제대로 된 CG쉐이더 방식으로 버텍스의 좌표변환부터 제대로 처리해야 작동한다 .

배우기는 힘들지만 , 완전히 수동제어가 가능하여 최적화와 고급기법의 표현에 좋다 .

 

Shader "Unlit/SingleColor"
{
	Properties
    {
    	//Color property for material inspector, default to white
        _Color ("Main Color", Color ) = (1,1,1,1)
    }
    SubShader
    {
    	Pass
        {
        	CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            //vertex Shader
            //this time instead of using "appdate"struct , just spell inputs manually,
            //and instead of returning v2f struct, also just return a single output
            //float 4 clip position
            float4 vert(float4 vertex: POSITION) : SV_POSITION
            {
            	return mul(UNITY_MATRIX_MVP,vertex);
            }
            
            //color from the material
            fixed4 _Color;
            
            //pixel shader , no inputs needed
            fixed4 frag(): SV_Target
            {
            	return _Color;//just return it
            }
            ENDCG
        }
    }
}