ShaderLab : http://liveupdate.tistory.com/336
Unity3D 쉐이더 레퍼런스 : https://docs.unity3d.com/kr/530/Manual/SL-Reference.html
서피스 쉐이더
Shader "이름" {
Properties {
_프로퍼티("이름", 타입) = 값
}
Subshaders {
Tags {
// 유니티 프로퍼티
"RenderType"="Opaque"
"Queue"="Geometry+1"
"ForceNoShadowCasting"="True"
}
LOD 200
CGPROGRAM
// 실제 쉐이더 cg 코드
#pragme surface surf Lambert alpha
struct Input {
};
void surf( Input IN, inout SurfaceOutput o ) {
}
ENDCG
}
FallBack "Diffuese"
}
서피스 쉐이더 입력구조
버텍스쉐이더(vertex:함수명)의 입력구조(appdata)와 달리
사용할 데이터만 정의해서 사용.
기본 텍스처 uv좌표를 포함해야 함 : float2
struct Input {
float2 uv_MainTex;
// 기타
float3 viewDir;
float4 color : COLOR;
float4 screenPos;
float3 worldPos;
float3 worldRefl;
float3 worldNormal;
}
서피스 함수 선언
#pragma surface 서피스함수명 라이트모델 옵션
라이트모델
Lambert
specular 없이 음영만 존재하는 가벼운 라이트
BlinnPhong
Lambert 에 가볍게 specular 를 사용
Properties에 아래내용을 정의해 줘야하고, 해당 값은 코드에서 사용할 수 없음.(예약어)
Properties {
_SpecColor("Specular Color", color) = (1,1,1,1)
}
Standard
StandardSpecular
옵션
alpha
apha:blend
alpha:fade
alpha:premul
alphatest:VariableName
keepalph
decal:add
decal:blend
vertex:VertexFunctiuon
finalcolor:ColorFunction
finalgbuffer:ColorFunction
finalprepass:ColorFunction
tessellate:TessFunction
addshadow
fullforwardshadow
서피스 함수
void surf( Input IN, inout SurfaceOutput o ) {
}
별도의 버텍스 쉐이더 추가
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
}
버텍스 함수
void vertexFunction( inout appdata v )
{
}
서피스쉐이더 표준 출력 구조
서피스쉐이더가 출력하는 표준 구조
서피스 함수에 출력 포맷으로 원하는 출력형을 지정할 수 있음.
Rambert, BlinnPhong 라이팅 모델에서 사용
struct SurfaceOutput
{
fixed3 Albedo; // diffuse or specular color
fixed3 Normal;
fixed3 Emission;
half Specular; // specular power(0~1)
fixed Gloss; // specular intensity
fixed Alpha;
}
물리기반 조명모델을 사용하는 경우 아래의 출력 구조 사용
모바일 기기도 성능이 개선됨에 따라 일반적으로 아래 두 구조를 사용
struct SurfaceOutputStandard
{
fixed3 Albedo;
fixed3 Normal;
half3 Emission;
half Metallic;
half Smoothness;
half Occlusion; // occlusion (default 1)
fixed Alpha;
}
struct SurfaceOutputStandardSpecular
{
fixed3 Albedo;
fixed3 Specular;
fixed3 Normal;
half3 Emission;
half Smoothness;
half Occlusion;
fixed Alpha;
}
내장 프로퍼티 : https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html
float4x4 UNITY_MATRIX_MVP : model * view * projection
float4x4 UNITY_MATRIX_MV
float4x4 UNITY_MATRIX_VP
float4x4 UNITY_MATRIX_V
float4x4 UNITY_MATRIX_P
float4x4 unity_ObjectToWorld
float4x4 unity_WorldToObject
float4 _Time : 씬이 열린 이후 시간, (t/20, t,2*t,3*t)
float4 _SinTime : (t/8, t/4, t/2, t)
float4 _CosTime : (t/8, t/4, t/2, t)
float4 unity_DeltaTime : (dt, 1/dt, smoothDt, 1/smoothDt)
예제
텍스처, 노멀 매핑
Shader "Custom/Sample" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_BumpMap("Bumpmap", 2D) = "bump" {}
}
SubShader {
Tags{"RenderType"="Opaque"}
CGPROGRAM
// 서비스 함수 및 라이팅 설정
#pragma surface surf Lambert
// 입력 구조 설정
struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
};
// 프로퍼티와 동일한 이름의 텍스처 변수 선언
sample2D _MainTex;
sample2D _BumpMap;
// 함수 정의
void surf(Input IN, inout SurfaceOutput o ) {
fixed4 color = tex2D( _MainTex, IN.uv_mainTex);
o.Albedo = color.rgb;
fixed3 normal = UnpackNormal( tex2D( _BumpMap, IN.uv_BumpMap));
o.Normal = normal;
}
ENDCG
}
Fallback "Diffuse"
}
슬라이스
Shader "Custom/Slice Sample" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
Cull Off
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
float3 worldPos;
};
sample2D _MainTex;
void surf( Input IN, inout SurfaceOutput o ) {
clip( frac(( IN.worldPos.y + IN.worldPos.z * 0.1) * 5 ) - 0.5);
o.Albedo = tex2D( _MainTex, IN.uv_MainTex).rgb;
}
ENDCG
}
Fallback "Diffues"
}
'프로그래밍 > Unity' 카테고리의 다른 글
[Unity] AR Foundation Package (0) | 2018.09.20 |
---|---|
[Unity] 유니티용 DLL (0) | 2018.09.18 |
[Unity] VR 환경 끄거나 켜기 (0) | 2018.09.14 |
[Unity] AssetDatabase (0) | 2018.09.12 |
[Unity] AssetBundle (0) | 2018.08.24 |
[Unity] Mesh 생성 및 변경 (0) | 2011.06.24 |
[Unity] 인스펙터에 UI 추가하기 (0) | 2011.06.15 |
2D를 위한 Plane 생성 (0) | 2011.05.30 |
Physics.Raycast (0) | 2011.05.13 |
2D 게임을 위한 몇가지 (0) | 2011.05.09 |