오브젝트에 메터리얼(Material)과 쉐이더 적용

 

  1. 오브젝트 생성: (예시) GameObject > 3D Object > Sphere
  2. 쉐이더 생성:
  3. 메터리얼 생성:
  4. 적용:
    • 쉐이더->메터리얼 drag&drop / 메터리얼->화면 상의 오브젝트 drag&drop
    • 메터리얼의 Inspector에서 쉐이더 변경 / 오브젝트의 Inspector > Mesh Renderer > Meterials > Element 0 에 메터리얼 적용

 

쉐이더 코드


  • 쉐이더 코드를 더블 클릭하면 MonoDevelop 또는 VisualStudio 프로그램 실행
  • 기본 코드
    • Shader "Custom/NewSurfaceShader"에서 "Custom/NewSurfaceShader"는 메터리얼에서 선택할 수 있는 쉐이더의 이름이며 '/' 트리구조 생성

 

쉐이더 ProPerties

 Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
  • 쉐이더의 인터페이스인 Properties 영역
    • 이 부분에서 작성한 코드는 메터리얼의 인스펙터 인터페이스로 볼 수 있음.
    • 인터페이스를 만드는 방법
//Float을 받는 인터페이스
_Name ("display name", Range (min, max)) = number
_Name ("display name", Float) = number
_Name ("display name", int) = number

//Float4를 받는 인터페이스
_Name ("display name", Color) = (number, number, number, number)
_Name ("display name", Vector) = (number, number, number, number)

//기타 SampLer를 받는 인터페이스
_Name ("display name", 2D) = "name" { options }
_Name ("display name", Rect) = "name" { options }
_Name ("display name", Cube) = "name' { options }
_Name ("display name", 3D) = "name" { options }

 

1. Range
최솟값과 최댓값을 입력해주면 슬라이더가 나오는 명령

_Name ("display name", Range (min,max)) = number

 

2. Float
한 자리의 소수점을 입력받는 인터페이스

_Name ("display name", Float) = number

 

3. Color
R,G,B,A 4자리 숫자인 float4를 입력받는 인터페이스
_Name ("display name", Color) = (number,number,number,number)​

 

4. Vector
Color와 동일하게 float4를 숫자로 입력받지만, 색상이 아닌 값으로 입력받음
_Name ("display name", Vector) = (number,number,number,number)​

 

5. text2D
float 계열로 분류되지 않는 sampler들 (2D텍스쳐를 받는 인터페이스)
_Name ("display name", 2D) = "name" {options}​

 

 

 

색상 출력 및 연산


  • 유니티 자체 스크립트가 아닌 CG 언어를 이용하여 쉐이더를 짜는 CGPRGRAM ~ ENDCG 영역
 CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        #pragma enable_d3d11_debug_symbols

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG

1. 설정 부분
전처리 또는 스니핏(snippet)이라 부름. 쉐이더의 조명 계산 설정이나 세부적인 분기를 정해주는 부분

// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0

2. Input 구조체
엔진으로부터 받아와야 할 데이터

struct Input{
            float2 uv_MainTex;
};

3. 함수 영역
색상이나 이미지가 출력되는 부분

void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
  • o.Albed: 빛의 영향을 받는 색이 출력
  • o.Emmision: 빛의 영향을 받지 않는 색이 출력위와 같이 변수를 사용하여 출력 색상 변경 또한 가능하다.
void surf (Input IN, inout SurfaceOutputStandard o) { 
	float4 test = float4(1,0,0,0); 
    fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; 
    //o.Albedo = test.ggg; 
    //o.Albedo = test.b; 
    o.Albedo = test; 
    o.Alpha = c.a; }

 

 

외부의 입력값 출력


  • 색상 입력 받고 출력
    ex) properties에 _TestColor("TestColor", Color) = (1,1,1,1) 을 추가하여 인스펙터에 나타내고, float4 _TestColor; 로 변수를 추가한 뒤, surf 함수 내에서 o.Albedo = _TestColor.rgb;을 추가

즉, 인터페이스에서 원하는 타입의 변수를 생성한 후, SubShader 코드에 선언하고, surf함수에서 변수를 사용하면 출력 가능

 

+ Recent posts