본문 바로가기

프로그래밍/Unity

[unity3d] 서피스 쉐이더 정리

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)



fixed4 unity_AmbientSky
.
.




예제




텍스처, 노멀 매핑


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 = UnpackNormaltex2D( _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