float4x4 mWVP; // 4x4 행렬 texture Tex; // 텍스쳐
sampler Samp = sampler_state { Texture = <tex>; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = Clamp; AddressV = Clamp; }
struct VS_OUTPUT { float4 Pos : POSITION; float2 Tex : TEXCOORD0; }
//example VS_OUTPUT VS ( float4 Pos : POSITION float2 Tex : TEXCOORD0 ) { VS_OUTPUT out = (VS_OUTPUT)0; out.Pos = mul(Pos, mWMP); out.Tex = Tex; return out; }
float4 PS( VS_OUTPUT in ) : COLOR { return tex2D(Samp, in.Tex); }
technique TShader { pass P0 { VertexShader = compile vs_1_1 VS(); PixelShader = compile ps_1_1 PS(); } }
다수의 산술 함수들 지원
정점쉐이더 (Vertex Shader)
VS_OUTPUT vs_main( VS_INPUT input )
// POSITION은 시맨틱으로 좌표정보임을 알리는 역할을 한다. struct VS_INPUT { float4 mPosition : POSITION; } struct VS_OUTPUT { float4 mPosition : POSITION; }
이 과정이 끝나야 화면에 표시할 수 있는 좌표계로 변환된다.
// 좌표계변환을 위한 각 행렬들. 셰이더 작성 프로그램에는 사전에 정의된 값이 있음. float4x4 gWorldMatrix; float4x4 gViewMatrix; float4x4 gProjectionMatrix;
VS_OUTPUT vs_main(VS_INPUT Input) { VS_OUTPUT Output; Output.mPosition = mul( Input.mPosition, gWorldMatrix ); Output.mPosition = mul( Output.mPosition, gViewMatrix ); Output.mPosition = mul( Output.mPosition, gProjectionMatrix ); return Output; }
float4 ps_main() : COLOR { return float4( 1.0f, 0.9f, 0.0f, 1.0f ); }
람베르트 모델
난반사광 구하기
이런 순서로
정반사Supercular Light는 입사각과 출사각이 같은 빛.
정반사를 구하는 것은 퐁모델을 사용.
구할때 사용할 벡터
reflect() | 벡터의 반사벡터를 (빛의 입사각의 반사각을 구하는) 구하는 함수 |
param1 : 입사각 방향벡터, param2 : 입사각이 닿는, 반사면의 법선벡터 | |
mul() | 벡터 곱하기 |
normalize() | 노말벡터 구하기 |
dot() | 벡터 내적을 구한다. 두 벡터의 <m>cos{theta}</m>를 구하는데도 사용 |