잘 딱여진 물체를 보면 표엔 빛이 지쳐 반짝반짝 빛나게 된다.
특히 태양과 같은 강한 빛이 있으면 태양빛이 반사된 부분은 하이라이트라고 부르는 강하고 흰 빛이 눈부시게 그려진다.
이 하이라이트를 표현하기 위한 방법으로 가장 잘 알려진 반영(specularity) 반사 기법이 퐁에 의한 반영 반사 모델이다.
하이라이트와 같은 강한 반사는 입사한 빛이 반사되는 각도에서 보았을 때 제일 강하게 반사된다.
이말은 [ 시선이 물체에서 반사되었을 때, 그 방향이 빛의 입사방향에 가까울수록 밝게 보인다. ]고 바꾸어 말 할 수 있다.
퐁은 시선이 물체에 반사되었을 때의 반사 벡터 R을 구해서 반사벡터가 광원 벡터(물체에서 광원을 향하는) L과 가까우면 강한 빛,
R과 L이 멀면 약한 빛이 되도록 수식화 했다.
퐁의 반사 모델을 수식으로 나타내면
반사 벡터는 R = -E + 2( N o E )N 으로 구한다. E는 시선 벡터로, 물체에서 카메라를 보는 방향이다.
단, 퐁의 반사 모델에서도 내적 값이 음수가 되는 경우에는 빛이 닿지 않는 것으로 해석하여 강도를 0으로 계산한다.
n은 반사 지수라 부르는데, 만약 n이 무한대라면 L • R이 1.0일 때만 1.0이며, 1.0이하라면 0이 된다.
즉, 반사 벡터와 광원 벡터 방향이 같은 부분만 비춘다. ==> 거울 그자체이다.
반사 지수가 무한대가 아닐 때는, 반사 벡터가 광원 벡터에서 조금 벗어난 곳도 밝아진다. 즉, 하이라이트가 희미하게 확대된다.
하이라이트는 반자 지수에 의해 크게 바뀌게 되는데 반사 지수가 10 이하의 작은 값일 때는, 넓은 범위에 걸쳐서 반사 하이라이트가 적용 되지만
반사 지수가 100 정도로 커지면 반짝이는 표면이 되어 하이라이트가 점의 형태로 된다.
반영 반사 계수 Ks는 확산 반사광이나 환경광의 계수와는 다른것이다. 반영 반사작용이 두드러진 예로는 자동차를 들을 수 있다.
잘 정비된 자동차를 보면 왁스가 칠해져 있고, 그 밑에는 도료가 칠해져 있다.
반영 반사는 이 왁스 부분에서 반사되는 빛이고, 확산 반사나 환경광은 그 아래 도료에서 반사되는 빛이다. 평상시에 보이는 자동차색은 도료색이지만,
반영 반사광은 도료 면에 닿기 전에 반사되는 빛이므로 도료 색은 나타나지 않는다.
보통 왁스에는 색이 들어가 있지 않기 때문에 반영 반사광의 색은 흰색이다. 물론 왁스를 바르지 않아도 반영 반사하는 빛 성분이 많이 있지만
반영 반사광은 물체 표면에서 일어나는 빛이고, 확산 반사광은 그것 보다 좀더 깊은 면에서 여러 번 산란되고 나서 나오는 빛이므로, 그 색은 크게 차이가 난다.
간단하게, 반영 반사광은 흰색이라고 생각하면 된다.
반영 반사는 반짝이는 면을 나타내는 데 적합하므로, 잘 닦여진 플라스틱 표면을 표현할 때 유용하게 사용할 수 있다.
ㅇ 렌더몽키
- 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 eye = normalize(vEyePos - Input.Position.xyz);
float3 L = -vLightDir;
float3 N = Input.Normal.xyz;
float3 R = -eye + 2.0f * dot(N,eye) * N;
Output.Color = vColor * max(amb, dot(Input.Normal, L))
+ pow( max(0,dot(L,R)),10);
return( Output );
}
- Pixel Shader
struct PS_INPUT
{
float4 color : COLOR0;
};
float4 ps_main(PS_INPUT input) : COLOR0
{
return( input.color );
}
ㅇ 렌더몽키 결과
ps 실제로 해보면 왜 이렇게 나오는지 모르겠다.. 블린-퐁 반영 반사광은 잘 되는데 왜 퐁반영 반사광은 안되는겨....;;;
ps : 참고 서적
'[ C/ C++ 프로그래밍 ] > [ Shader ]' 카테고리의 다른 글
Glow 효과 (1) | 2010.07.07 |
---|---|
[HLSL] 블린- 퐁 반영 반사광 (2) | 2010.06.02 |
[HLSL] 램버트 확산 조명 (1) | 2010.06.02 |
렌더몽키 다운로드 사이트 (2) | 2010.05.31 |
[HLSL] 삼각형에 Texture 입히기 (0) | 2010.05.31 |