UV 애니메이션과 울렁효과
정점 셰이더
struct VS_INPUT{
float4 mPosition : POSITION;
float3 mNormal : NORMAL;
float2 mUV : TEXCOORD0;
};
struct VS_OUTPUT{
float4 mPosition : POSITION;
float2 mUV: TEXCOORD0;
float3 mDiffuse : TEXCOORD1;
float3 mViewDir : TEXCOORD2;
float3 mReflection : TEXCOORD3;
};
float gWaveHeight;
float gSpeed;
float gWaveFrequency;
float gUVSpeed;
//uv에니메이션과 울렁 효과를 위한 float 타입의 변수 4개 추가
float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;
float gTime;
float4 gWorldLightingPosition;
float4 gWorldCameraPosition;
VS_OUTPUT vs_main (VS_INPUT Input){
VS_OUTPUT Output;
float3 cosTimeX = gWaveHeight * cos(gTime * gSpeed + Input.mUV.x * gWaveFrequency);
float3 cosTimeY = gWaveHeight * cos(gTime * gSpeed + Input.mUV.y * gWaveFrequency);
Input.mPosition.xy += cosTimeY + cosTimeX;
//cos(): 함수를 이용해 uv와 버텍스 애니메이션 구현
//cosTime 을 하나 더 추가해 y축도 추가로 구현.
Output.mPosition = mul(Input.mPosition, gWorldMatrix);
float3 lightDir = Output.mPosition.xyz - gWorldLightingPosition;
lightDir = normalize(lightDir);
float3 viewDir = normalize(Output.mPosition.xyz - gWorldCameraPosition.xyz);
Output.mViewDir = viewDir;
Output.mPosition = mul(Output.mPosition, gViewMatrix);
Output.mPosition = mul(Output.mPosition, gProjectionMatrix);
float3 worldNormal = mul(Input.mNormal,(float3x3)gWorldMatrix);
worldNormal = normalize(worldNormal);
Output.mDiffuse = dot(-lightDir, worldNormal);
Output.mReflection = reflect(lightDir,worldNormal);
Output.mUV = Input.mUV + float2(gTime*gUVSpeed, 0);
return Output;
}
픽셀 셰이더
sampler2D DiffuseSampler;
sampler2D SpecularSampler;
float3 gLightColor;
struct PS_INPUT{
float2 mUV : TEXCOORD0;
float3 mDiffuse : TEXCOORD1;
float3 mViewDir : TEXCOORD2;
float3 mReflection : TEXCOORD3;
};
float4 ps_main(PS_INPUT Input):COLOR{
float4 albedo = tex2D( DiffuseSampler, Input.mUV );
float3 diffuse = gLightColor*albedo.rgb*saturate(Input.mDiffuse);
float3 reflection = normalize(Input.mReflection);
float3 viewDir = normalize(Input.mViewDir);
float3 spacular = 0;
if( diffuse.x > 0){
spacular = saturate(dot(reflection,-viewDir));
spacular = pow(spacular, 20.0f);
float4 specularIntensity = tex2D( SpecularSampler, Input.mUV);
spacular *= specularIntensity.rgb * gLightColor;
}
float3 ambient = float3(0.1f, 0.1f, 0.1f) * albedo;
return float4(ambient + diffuse + spacular,1);
}
*HLSL*
cos() : 코사인 함수
'Unity공부 > HLSL Shader 공부' 카테고리의 다른 글
셰이더 프로그래밍 입문-10 (0) | 2012.12.10 |
---|---|
셰이더 프로그래밍 입문-9 (0) | 2012.12.04 |
셰이더 프로그래밍 입문-7 (0) | 2012.11.27 |
셰이더 프로그래밍 입문-6 (0) | 2012.11.21 |
셰이더 프로그래밍 입문-5 (0) | 2012.11.19 |