오브젝트에 메터리얼(Material)과 쉐이더 적용
- 오브젝트 생성: (예시) GameObject > 3D Object > Sphere
- 쉐이더 생성:
- 메터리얼 생성:
- 적용:
- 쉐이더->메터리얼 drag&drop / 메터리얼->화면 상의 오브젝트 drag&drop
- 메터리얼의 Inspector에서 쉐이더 변경 / 오브젝트의 Inspector > Mesh Renderer > Meterials > Element 0 에 메터리얼 적용
쉐이더 코드
- 쉐이더 코드를 더블 클릭하면 MonoDevelop 또는 VisualStudio 프로그램 실행
- 기본 코드
- Shader "Custom/NewSurfaceShader"에서 "Custom/NewSurfaceShader"는 메터리얼에서 선택할 수 있는 쉐이더의 이름이며 '/' 트리구조 생성
- 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함수에서 변수를 사용하면 출력 가능
'Unity > Shader' 카테고리의 다른 글
[유니티 쉐이더 스타트업] Part6 | UV 개념/응용 (1) | 2024.01.24 |
---|---|
[유니티 쉐이더 스타트업] Part5 | Surface Shader를 이용한 Texture 제어 (0) | 2024.01.22 |
[유니티 쉐이더 스타트업] Part3 | 유니티 쉐이더 작성 (0) | 2024.01.21 |
[유니티 쉐이더 스타트업] Part2 | 쉐이더를 익히기 위한 기반 지식들 (0) | 2024.01.21 |
[유니티 쉐이더 스타트업] Part1 | 쉐이더(Shader)란? (0) | 2024.01.21 |