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>를 구하는데도 사용 |