ㅇ 블린- 퐁 반영 반사광
퐁의 반영 반사 모델은 반사 벡터를 계산해야만 한다.
그러나 특정 환경에서는 반사 벡터를 계산하는 것이 어려워 대체적인 방법으로 블린-퐁(Bilnn-Phong) 반영 반사 모델 이라는 것을 생각해 냈다.
블린-퐁 반영 반사 모델에서는 하프 벡터(Half Vector)가 사용된다. 하프 벡터는 광원 벡터 L과 벡터E의 중간의 각도에 있는 벡터로 아래와 같이 나타낸다.
블린 - 퐁의 반영 반사광은 하프 벡터와 법선 벡터 내적의 곱으로 계산한다.
이 반영 반사광의 강도가 가장 큰 곳은 법선 벡터와 하프 벡터의 방향이 가까운 경우, 즉 법선 벡터와 하프 벡터가 같은 경우이다.
이것은 정확히 시선 벡터와 법선 벡터가 이루는 각도와 광원 벡터와 법선 벡터가 이루는 각도가 동일한 곳으로 시선벡터로부터 반사 벡터를 만들었을 때,
반사 벡터가 광원 벡터와 일치하는 상황이다.
따라서 블린-퐁 반영 반사 모델과 퐁 반영 반사 모델은 하이라이트의 중심이 같은 위치가 된다.
실제로 블린-퐁 반영 반사모델과 퐁 반영 반사 모델의 차이는 작다.
예를 들어, 제곱의 크기 n을 30으로 해서 구 모델(sphere)을 두가지 방법으로 렌더링해보면 하이라이트의 위치나
크기는 약간 다르지만 양쪽 모두 같은 위치에 하이라이트가 생긴다.
ㅇ 렌더몽키
- Vertex Shader
float4x4 matWorldViewProjection;
float4 vLightDir;
float4 vColor;
float3 vEyePos;
struct VS_INPUT
{
float4 Position : POSITION0;
float4 Normal : NORMAL;
};
struct VS_OUTPUT
{
float4 Position : POSITION0;
float4 Color : COLOR0;
};
VS_OUTPUT vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;
Output.Position = mul( Input.Position, matWorldViewProjection );
float amb = -vLightDir.w;
float3 L = -vLightDir;
float3 N = Input.Normal.xyz;
float3 eye = normalize( vEyePos - Input.Position.xyz);
float3 H = normalize(eye + L);
Output.Color = vColor * max(amb, dot(Input.Normal, -vLightDir ))
+ pow( max(0,dot(N,H)),100);
return( Output );
}
- Pixel Shader
struct PS_INPUT
{
float4 color : COLOR0;
};
float4 ps_main(PS_INPUT input) : COLOR0
{
return( input.color );
}
ㅇ 렌더몽키 결과
ps 참고
'[ C/ C++ 프로그래밍 ] > [ Shader ]' 카테고리의 다른 글
VC++ 2008에서 쉐이더 코드를 C++ 코드처럼 (0) | 2010.07.07 |
---|---|
Glow 효과 (1) | 2010.07.07 |
[HLSL] 퐁 반영 반사광 (반사벡터) (2) | 2010.06.02 |
[HLSL] 램버트 확산 조명 (1) | 2010.06.02 |
렌더몽키 다운로드 사이트 (2) | 2010.05.31 |