소스는 라이팅을 뺀 기본 맵핑 소스로만 구성하였다.
그리고 빨간색으로 된 부분은 금일 공부할 내용들이다.
========================================================================================
//------------------------------------
float4x4 matWVP : WorldViewProjection;
texture diffuseTexture
<
string ResourceName = "default_color.dds";
>;
sampler diffuseSampler = sampler_state
{
texture = <diffuseTexture>;
};
float time : TIME; // 쉐이더에서 유일하게 가변변수로 사용할수 있는 변수로 시간에 따른 맵의 움직임을 제어하기 위해 사용되었다
//------------------------------------
struct vertexInput {
float3 Position : POSITION;
float2 UV : TEXCOORD0;
};
struct vertexOutput {
float4 HPosition : POSITION;
float2 UV : TEXCOORD0;
};
//------------------------------------
vertexOutput VS_TransformDiffuse(vertexInput IN)
{
vertexOutput OUT;
OUT.HPosition = mul( float4(IN.Position.xyz , 1.0) , matWVP);
float2 moveUV = IN.UV; // UV 작업을 위해 임이의 변수를 선언했다
//OUT.UV.y = -moveUV.x + 1; // x축의 UV를 플립 시킨다. 0 ~ 1 까지의 라인을 -1 ~ 0 으로 뒤집어준뒤 1 만큼 이동시켜주는 원리
OUT.UV.y = pow((-moveUV.x + 1),2); // 제곱을 함으로 인해 맵을 한쪽으로 쏠리게 할수 있다.(0에서 1사이의 제곱을 하게 되면 커브곡선으로 되는 원리를 이용)
//OUT.UV.x = moveUV.y; // U와 V의 위치를 바꾸기 위한 코드
//OUT.UV.x = moveUV.y + time; // 뒤에 TIME은 시간에 의한 이동을 줄수 있다.(키값으로도 설정 가능)
//OUT.UV.x = moveUV.y + sin(time); // 사인곡선으로 인해 좌우로 왔다갔다 하는 애니메이션이 가능
//OUT.UV.x = moveUV.y + sin(time)*pow((IN.UV.x),2); // *IN.UV.x 으로 아래쪽을 고정시킨후 제곱을 함으로 인해 곡선을 가진 움직임을 만들었다.
OUT.UV.x = moveUV.y +
sin(time)*pow((IN.UV.x),2) + cos(time)*IN.UV.x; // cos(time)*IN.UV.x 를
더해줌으로 기존에 한방향으로만 움직이던 것을 반대방향으로 엇갈리게 만들어 S자를 그리게 만들었다.
OUT.UV = IN.UV;
return OUT;
}
float4 PS_TransformDiffuse(vertexOutput IN) : COLOR
{
float4 diffuseColor = tex2D(diffuseSampler, IN.UV);
return diffuseColor;
}
//-----------------------------------
technique textured
{
pass p0
{
VertexShader = compile vs_3_0 VS_TransformDiffuse();
PixelShader = compile ps_3_0 PS_TransformDiffuse();
}
}
'기본 쉐이더' 카테고리의 다른 글
Rim Lighting 의 원리와 공식 (0) | 2011.08.27 |
---|---|
Half Lambert 의 원리와 공식 (0) | 2010.12.09 |
스터디 - 스페큘러맵 (0) | 2010.11.28 |
스터디 - 기본 노멀맵 (0) | 2010.11.16 |
빛에 관한 공식 (0) | 2010.09.16 |