본문으로 바로가기

Unity 기본 3가지 shader 정리

category Technical Report/Unity Shader 2015. 3. 10. 15:04
반응형




이전 포스팅 업데이트 및 보완 그리고 추가..



Fixed Function Program


 - 키워드 구성

 - 정점기반 라이팅(가볍고 빠르다)

 - 오래된 하드웨어와 호환


Fixed Function Program 예시


Shader "Fixed Function Shader"


{


Properties {

 _Color  ("Main Color", Color) = (1,1,1,0)

 _SpecColor ("Spec Color", Color) = (1,1,1,1)

 _Emission ("Emissive Color", Color) = (0,0,0,0)

 _Shininess ("Shininess", Range (0.01, 1)) = 1

 _MainTex ("Base (RGB)", 2D) = "white" {}

 _BlendTex ("Alpha Blended (RGBA)", 2D) = "white" {}

]


SubShader {

 

 Pass {


Material {


Diffuse [_Color]

Ambient [_Color]

Shininess[_Shininess]

Specular[_SpecColor]

Emiision[_Emission]

}


Lighting On

SeparateSpecular On

SetTexture [_MainTex] {

combine previous * texture

}


SetTexture[_BlendTex] {

combine previous lerp (texture) texture

}

}

}

}


-----------------------------------


Vertex / Fragment Program


 - Shader Model : 2.0/3.0

 - Shader language : Cg, GLSL

 - Shader : vertex, pixel shader

 - CGIncludes directory

 - 셰이더 관련 다양한 매크로 및 함수 제공

 - Cg to GLSL 자동 변환


Vertex / Fragment shader 예시



Shader "Cg shader"


{


SubShader {


Pass {


CGPROGRAM


#pragma vertex vert

#pragma fragment frag


float4 vert(float4 inVert : POSITION) : SV_POSITION


{

float4 outVert = mul (UNITY_MATRIX_MVP, inVert);

return outVert;

}


half4 frag(float4 i) : COLOR

{

return half4(1.0, 0.0, 0.0, 1.0);

}


ENDCG


}

}

}



    CGPROGRAM

    #pragma vertex vertfunc

    #pragma fragment fragfunc


vertfunc 라는 이름을 가진 함수가 버텍스 프로그램 (셰이더 함수)이며, fragfunc 라는 이름을 가진 함수는 프래그먼트 프로그램 (셰이더 함수)라는 것을 가리키는 것. 그리고 이 vertfuc와 fragfunc 함수들을 Cg코드로 작성될 것을 지시한다.


#pragma target : 어떤 버전의 셰이더 모델로 컴파일할 지를 지정.  유니티는 기본적으로 셰이더 2.0 버전에 맞추어 컴파일하므로 3.0 모델을 사용할 경우는 : #pragma target 3.0


#pragma exclude_renderers xbox360 ps3(xbox360과 ps3 컴파일 하지 않도록 함) : 유니티는 지원 가능한 렌더러들(d3d9, OpenGL등등)에 대해서 모든 셰이더들을 컴파일하게 되는데 #pragma only_renderers와 #pragma exclude_renderes를 이용하여 특정 렌더러들에 대해서만 컴파일 하거나, 특정 렌더에 대해서 컴파일 하지 않도록 정의 할 수 있다.


현재 지원하는 렌더러 : d3d9, d3d11, opengl, gles, xbox360, ps3, flash 등




------------------------------------------------------


surface Shader


Shader "Surface shader"


Properties {

 

  _MainTex ("Base (RGB)", 2D) = "white" {}


}


SubShader {

 Tags { "RenderType" = "Opaque" }

 

CGPROGRAM

 #pragma surface surf lambert


 sampler2D _MainTex'


struct Input {


float2 uv_MainTex;


};


void sur (Input IN, inout SurfaceOutput o) {

half4 c = tex2D (_MainTex, IN.uv_MainTex);

 o.Albedo = c.rgb;

 o.Alpha = c.a;

}

ENDCG

}

}



------------------------------------------------


Cg/HLSL 에서 정의하는 기본 3가지


float : 32bit 매우 정밀한 부동 소수점

half : 16bit의 중간 정밀도의 부동 소수점. 6만 ~ -6만 사이의 값, 3.3 정확도의 자릿수

fixed : 11bit의 낮은 정밀도의 부동 소수점. 2.0 ~ -2.0 사이의 값, 1/256 정확도의 자릿수



참조 포스팅 : 흑기사의 방랑일지(유니티 셰이더의 기초) #6




반응형

'Technical Report > Unity Shader' 카테고리의 다른 글

weed shader animation  (0) 2015.05.11
Lava Shader  (0) 2015.04.30
Unity 5 surface emission shader lighting  (0) 2015.03.08
surface shader noambient parameter  (0) 2015.01.28
Fade in/out 연출을 위한 shader  (3) 2015.01.23