본문 바로가기
SHADER

유니티 셰이더 익히기 - 1 기본 개념 파악

by tartist 2015. 12. 30.

참고  -http://book.naver.com/bookdb/book_detail.nhn?bid=7525807

 

Properties 개념 익히기

-       셰이더 프로그래머가 직접 규격에 맞춰 GUI 요소를 셰이더 코드에 빠르게 추가할 수 있다. Properties 블록에서 선언한 프로퍼티는 셰이더 코드에서 값, 색상, 그리고 텍스쳐를 변경하는 데 사용할 수 있다.

           Properties

           {

                     _EmissiveColor ("Emissive Color", Color) = (1,1,1,1)

                     _AmbientColor ("Ambient Color" , Range(0,10)) = 2

                     _MySliderValue ("This is a Slider", Range(0,10)) = 2.5

           //         변수 이름          인스펙터GUI이름   타입      기본값

           }

 

프로퍼티 타입 정리

Range(min, max)

최솟값부터 최댓값까지의 범위를 float프로퍼티의 슬라이더를 만든다.

Color

Inspector탭에 Color =(float , float, float, float)를 선택할 수 있는 색상 견본을 만든다.

2D

셰이더로 드래그할 수 있는 텍스쳐 견본을 만든다.

Rect

2의 승수가 아닌 텍스쳐 견본을 만든다. 2D GUI 요소와 같은 기능을 한다.

Cube

Inspector 탭에서 셰이더로 드래그할 수 있는 큐브맵(cube map) 견본을 만든다.

Float

Inspector 탭에 슬라이더가 아닌 float 값을 만든다.

Vector

방향, 색상을 만들 수 있는 4개의 float 프로퍼티를 만든다.

 

 

 

http://docs.unity3d.com/Manual/SL-Properties.html

 

SubShader 개념 익히기

_EmissiveColor , _AmbientColor, _MySliderValue 값을 SubShader{}에서 사용하기 위해서는 프로퍼티의 변수 이름과 똑 같은 이름으로 새로운 변수 3개를 만들어야 한다. 이렇게 하면 동일한 데이터로 작업할 수 있도록, 기존 변수와 새 변수 사이에 자동으로 링크를 설정한다.

                     float4 _EmissiveColor;

                     float4 _AmbientColor;

                     float _MySliderValue;

 

Surf 개념 익히기

SubShader 에서 변수를 만들면, surf{} 함수에서 값을 사용할 수 있다.

c = pow((_EmissiveColor + _AmbientColor), _MySliderValue);  

 

Properties , SubShader , Surf에 대한 세 가지 개념만 확립하면 디퓨즈 컴퍼넌트를 요구하는 셰이더를 만들기 위한 기반이 확립된다.

 

 

세 가지의 기본적인 사항을 파악하고 아래의 코드를 작성하면 기본적인 셰이더를 만들 수 있다.

Shader "Custom/BasicShader" {

Properties

 {

  _EmissiveColor ("Emissive Color", Color) = (1,1,1,1)

  _AmbientColor ("Ambient Color" , Color) = (1,1,1,1)

 _MySliderValue ("This is a Slider", Range(0,10)) = 2.5

 }

SubShader {

 Tags { "RenderType"="Opaque" }

LOD 200

                    

 CGPROGRAM

#pragma surface surf Lambert

 

float4 _EmissiveColor;

float4 _AmbientColor;

float _MySliderValue;

 

 struct Input {

                  float2 uv_MainTex;

                 };

 

 void surf (Input IN, inout SurfaceOutput o) {

 float4 c;

c = pow((_EmissiveColor + _AmbientColor), _MySliderValue);                               

 o.Albedo = c.rgb;

 o.Alpha = c.a;

 }

ENDCG

 }

 FallBack "Diffuse"

}