±âº» Á¶¸í

°ÔÀÓ»óÀÇ ±âº»ÀûÀÎ Á¶¸í °ø½ÄÀº ´ÙÀ½°ú °°´Ù.

±Û·Î¹ú ÀÏ·ç¹Ì³×ÀÌ¼Ç = ¾Úºñ¾ðÆ® ¶óÀÌÆ® + µðÇ»Áî ¶óÀÌÆ® + ½ºÆåŧ·¯ ¶óÀÌÆ® + ¿¡¹Ì¼Ç(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