°ÔÀÓ»óÀÇ ±âº»ÀûÀÎ Á¶¸í °ø½ÄÀº ´ÙÀ½°ú °°´Ù.
±Û·Î¹ú ÀÏ·ç¹Ì³×ÀÌ¼Ç = ¾Úºñ¾ðÆ® ¶óÀÌÆ® + µðÇ»Áî ¶óÀÌÆ® + ½ºÆåŧ·¯ ¶óÀÌÆ® + ¿¡¹Ì¼Ç(emission) ¶óÀÌÆ®
¿¡¹Ì¼Ç ¶óÀÌÆ®´Â ºûÀÇ ÀÚü ¹ß±¤»öÀ¸·Î ¿©±â¼´Â ¹«½ÃÇÑ´Ù.
¾Úºñ¾ðÆ® ¶óÀÌÆ® : ¾ÀÀÇ ±âº» »ö±ò
µðÇ»Áî ¶óÀÌÆ® : °¡Àå ÈçÈ÷ »ç¿ëµÇ´Â ¹æ¹ýÀº ·¥¹öÆ®ÀÇ ¹ýÄ¢( Lambert's law )ÀÌ´Ù. ¸ðµç ¹æÇâ¿¡ °°Àº °µµ·Î ¹Ý»çµÇ¸ç, ºûÀº Ä«¸Þ¶óÀÇ ¹æÇâ¿¡ ¹«°üÇÏ´Ù.
·¥¹öÆ®ÀÇ ¹ýÄ¢Àº ´ÙÀ½°ú °°´Ù.
max(N¡ÜL, 0)
N : ¹öÅؽº ³ë¸Ö°ª L : ¶óÀÌÆà º¤ÅÍ
¹öÅؽº ³ë¸Ö°ª°ú ¶óÀÌÆà º¤ÅÍ°¡ ¥è >= 90ÀÌ¸é ºûÀÇ ¼¼±â´Â 0ÀÌ´Ù. ¥è = 0ÀÌ¸é ¹öÅؽº ³ë¸Ö°ª°ú ¶óÀÌÆà º¤ÅÍ°¡ µ¿ÀÏÇÏ¸ç ºûÀÇ ¼¼±â´Â °¡Àå °ÇÏ´Ù.
float3 diffuse = dot(-lightDir, normal); diffuse = saturate(diffuse);
|
½ºÆåŧ·¯ ¶óÀÌÆ® :
°¡Àå ÈçÈ÷ »ç¿ëµÇ´Â ¹æ¹ýÀº Æþ ¸ðµ¨ÀÌ´Ù. ½Ã¼± º¤ÅÍ( view vector)¿Í ¹Ý»ç º¤ÅÍ( reflection vector )¸¦ ÀÌ¿ëÇØ ºûÀÇ ¾çÀ» ±¸ÇÑ´Ù. ¹Ý»ç º¤ÅÍ´Â ºûÀÌ ¹°Ã¼ÀÇ ³ë¸Ö°ª¿¡ ´ëÇÏ¿© ¹Ý»ç µÇ´Â º¤ÅÍÀÌ´Ù.
max(R¡ÜV, 0)^¥á
R : ¹Ý»ç º¤ÅÍ V : ½Ã¼± º¤ÅÍ ¥á : powÀÇ ½ÂÀ¸·Î ÇÏÀ̶óÀÌÆ®¸¦ ¹üÀ§¸¦ Á¼°Ô ¸ðÀ»·Á¸é 20ÀÌ»ó Ŭ¼ö·Ï ÇÏÀ̶óÀÌÆ® ¹üÀ§°¡ Á¼´Ù.
float3 viewDir = output.pos.xyz - gCameraPos.xyz; viewDir = normalize(viewDir);
float3 reflection = reflect(lightDir, normal); if(diffuse.x > 0) { specular = saturate(dot(reflection, -viewDir)); specular = pow(specular, 20); }
|
struct VS_INPUT
{
float4 pos : POSITION;
float3 normal : NORMAL;
};
struct VS_OUTPUT
{
float4 pos : POSITION;
float3 diffuse : TEXCOORD1;
float3 viewDir : TEXCOORD2;
float3 reflection : TEXCOORD3;
};
float4x4 gWorldMat;
float4x4 gViewMat;
float4x4 gProjMat;
float4 gLightPos;
float4 gCameraPos;
VS_OUTPUT vs_main(VS_INPUT input)
{
VS_OUTPUT output;
output.pos = mul(input.pos, gWorldMat);
float3 lightDir = output.pos.xyz - gLightPos.xyz;
lightDir = normalize(lightDir);
float3 viewDir = output.pos.xyz - gCameraPos.xyz;
viewDir = normalize(viewDir);
output.viewDir = viewDir;
output.pos = mul(output.pos, gViewMat);
output.pos = mul(output.pos, gProjMat);
float3 normal = mul(input.normal, (float3x3)gWorldMat);
normal = normalize(normal);
output.diffuse = dot(-lightDir, normal);
output.reflection = reflect(lightDir, normal);
return output;
}
|
gLightPos °ªÀº ( 500, 500, -500, 1)ÀÌ´Ù. gCameraPos °ªÀº (0, 0, -200, 1)ÀÌ´Ù.
struct PS_INPUT
{
float3 diffuse : TEXCOORD1;
float3 viewDir : TEXCOORD2;
float3 reflection : TEXCOORD3;
};
float4 ps_main(PS_INPUT input) : COLOR
{
float3 diffuse = saturate(input.diffuse);
float3 reflection = normalize(input.reflection);
float3 viewDir = normalize(input.viewDir);
float3 specular = 0;
if(diffuse.x > 0)
{
specular = saturate(dot(reflection, -viewDir));
specular = pow(specular, 20);
}
float3 ambient = float3(0.1f, 0.1f, 0.1f);
return float4(ambient + diffuse + specular, 1);
}
|
reflection, viewDirÀ» Çȼ¿ ¼ÎÀÌ´õ¿¡¼ ´Ù½Ã Á¤±ÔÈ ÇØÁÖ°í ÀÖ´Ù. ¹öÅؽº ¼ÎÀÌ´õ¿Í Çȼ¿ ¼ÎÀÌ´õ »çÀÌÀÇ º¸°£±â·Î ÀÎÇØ ³ë¸Ö°ªÀÌ º¸°£µÇ¾î ´Ù½Ã Á¤±ÔÈ ½ÃÄÑÁØ´Ù.
if(diffuse.x > 0) { specular = saturate(dot(reflection, -viewDir)); specular = pow(specular, 20); }
|
µðÇ»Áî ¶óÀÌÆ®°¡ 0ÀÌ»óÀ϶§ ½ºÆåŧ·¯ ¶óÀÌÆ®¸¦ °è»êÇÕ´Ï´Ù.
ÂüÁ¶ : Æ÷ÇÁ ±è´ÔÀÇ ¼ÎÀÌ´õ ÇÁ·Î±×·¡¹Ö ÀÔ¹® Ã¥ ÂüÁ¶
·»´õ ¸ùÅ° ÆÄÀÏ : light.rfx ´ÙÀÌ·ºÆ® X ÆÄÀÏ : DxDemo_03_diffuselight.zip DxDemo_04_phong_arcball.zip
|