이전 포스팅 업데이트 및 보완 그리고 추가..
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 |