-만화 같은 명암을 입히는 툰 셰이더-
희안하게 주석 넣으면 오류난다....혹 이거 보시는 분들은 랜더몽키에 주석 빼시길....
정점 셰이더
struct VS_INPUT{
float4 mPosition : POSITION;
float3 mNormal : NORMAL;
};
struct VS_OUTPUT{
float4 mPosition : POSITION;
float3 mDiffuse : TEXCOORD1;
};
float4x4 gWorldViewProjectionMatrix;
//뷰,월드,프로젝션을 미리 구해 합쳐놓은 변수.
float4x4 gInvWorldMatrix;
//라이트 구하기 위한 역행열 변수.
float4 gWorldLightPosition;
//라이트 포지션.
VS_OUTPUT vs_main(VS_INPUT Input){
VS_OUTPUT Output;
Output.mPosition = mul(Input.mPosition, gWorldViewProjectionMatrix);
//미리 구해놓은 행열을 가지고 포지션을 구한다.
float3 objectLightPosition = mul(gWorldLightPosition,gInvWorldMatrix);
//라이트 포지션과 역행열을 이용해 라이트 포지션 구하기.
float3 LightDir = normalize(Input.mPosition.xyz - objectLightPosition);
// 버텍스 포지션과 라이트 포지션으로 라이트 구현하기.
Output.mDiffuse = dot(-LightDir, normalize(Input.mNormal));
//구현한 라이트와 노멀을 닷 공식으로 디퓨즈 구현.
return (Output);
}
픽셸셰이더
float3 gSurfaceColor;
//엠비언트 컬러쯤으로 보면된다....
struct PS_INPUT{
float3 mDiffuse : TEXCOORD1;
};
float4 ps_main(PS_INPUT Input):COLOR{
float3 diffuse = saturate(Input.mDiffuse);
//세튜레이트로 1를 넘는값은자른다.
diffuse = ceil(diffuse * 5)/5.0f;
//디퓨즈*5/5.0 한 값을 무조건 오림 함수로
return float4(gSurfaceColor * diffuse.xyz,1);
//엠비언트 컬러에 디퓨즈를 곱해 반환.
}
**HLSL함수**
ceil():무조건 올림 함수
'Unity공부 > HLSL Shader 공부' 카테고리의 다른 글
셰이더 프로그래밍 입문-7 (0) | 2012.11.27 |
---|---|
셰이더 프로그래밍 입문-6 (0) | 2012.11.21 |
셰이더 프로그래밍 입문-4 (0) | 2012.11.16 |
셰이더 프로그래밍 입문-3 (2) | 2012.11.14 |
셰이더 프로그래밍 입문-2 (0) | 2012.11.13 |