해당 포스팅은 " 따라 하면서 배우는 유니티 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)값을 가짐
'Shader' 카테고리의 다른 글
[ Shader ] 06. 스페큘러와 메탈릭 표면 (0) | 2023.05.25 |
---|---|
[ Shader ] 05.투명 표면 (0) | 2023.05.17 |
[ Shader ] 04.쉐이더를 이용한 애니메이션 (0) | 2023.05.13 |
[ Shader ] 03.조명과 발광 효과 (0) | 2023.05.11 |
[ Shader ] 01.표준 쉐이더(Standard Shader) 란? (0) | 2023.05.09 |