¼ÎÀÌ´õ ÀÔ¹®1

 

Per Vertex Lighting, No Specular Reflection - simpleLighting1.rfx
struct VS_INPUT
{
   float4 pos : POSITION;
   float3 normal : NORMAL;
};


struct VS_OUTPUT
{
   float4 pos : POSITION;
   float3 diffuse : TEXCOORD1;
};

float4x4 gWorldMat;
float4x4 gViewMat;
float4x4 gProjMat;

float4 gWorldLightPos;

VS_OUTPUT vs_main( VS_INPUT input)
{
   VS_OUTPUT output;
   
   output.pos = mul(input.pos, gWorldMat);
   
   float3 lightDir = output.pos.xyz - gWorldLightPos.xyz;
   lightDir = normalize( lightDir);
   
   output.pos = mul( output.pos, gViewMat);
   output.pos = mul( output.pos, gProjMat);
   
   float3 worldNormal = mul( input.normal, (float3x3)gWorldMat);
   worldNormal = normalize( worldNormal);
   
   output.diffuse = dot( -lightDir, worldNormal);
   
   return output;
}

//------------------------------------------------------------

struct PS_INPUT
{
   float3 diffuse : TEXCOORD1;
};


float4 ps_main( PS_INPUT input) : COLOR
{
   float3 diffuse = saturate( input.diffuse);
   return float4( diffuse, 1);   
}

´Ù¿î·Îµå : simpleLighting1.rfx

Per Vertex Lighting, Specular Reflection
float4x4 gWorldMat;
float4x4 gViewMat;
float4x4 gProjMat;

float4 gLightPos;
float4 gViewPos;

struct VS_INPUT
{
   float4 pos : POSITION;
   float3 normal : NORMAL;
};

struct VS_OUTPUT
{
   float4 pos : POSITION;
   float3 diffuse : TEXCOORD1;
   float3 reflection : TEXCOORD2;
   float3 viewDir : TEXCOORD3;
};

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 - gViewPos.xyz;
   output.viewDir = normalize( viewDir);
   
   output.pos = mul( output.pos, gViewMat);
   output.pos = mul( output.pos, gProjMat);
   
   float3 worldNormal = mul( input.normal, gWorldMat);
   worldNormal = normalize( worldNormal);
   output.diffuse = dot( -lightDir, worldNormal);
   
   output.reflection = reflect( lightDir, worldNormal);
   
   return( output );
   
}

//------------------------------------------------------------

struct PS_INPUT
{
   float3 diffuse : TEXCOORD1;
   float3 reflection : TEXCOORD2;
   float3 viewDir : TEXCOORD3;
};

float4 ps_main( PS_INPUT input) : COLOR
{   
   float3 diffuse = saturate( input.diffuse);
   
   float3 specular = 0;
   
   if( diffuse.x > 0)
   {
      float3 reflection = normalize( input.reflection);
      float3 viewDir = normalize( input.viewDir);
      
      specular = dot( reflection, -viewDir);
      specular = saturate( specular);
      
      specular = pow( specular, 20);
   }
   
   float3 ambient = float3( 0.1f, 0.1f, 0.1f);
   
   return( float4( ambient + specular + diffuse, 1.0f) );
}

´Ù¿î·Îµå : Lighting.rfx

µðÇ»Áî ¸Ê°ú ½ºÆåŧ·¯ ¸ÊÀ» Ãß°¡ÇÑ´Ù. ÅؽºÃÄ Ãß°¡½Ã ºûÀÇ ¾çÀ» ±¸ÇÏ´Â ¹æ¹ýÀÌ´Ù.

  • ³­¹Ý»ç±¤ = ºûÀÇ »ö»ó X µðÇ»Áî¸ÊÀÇ °ª X ³­¹Ý»ç±¤ÀÇ ¾ç
  • Á¤¹Ý»ç±¤ = ºûÀÇ »ö»ó X ½ºÆåŧ·¯¸ÊÀÇ °ª X Á¤¹Ý»ç±¤ÀÇ ¾ç
Specular Mapping
float4x4 gWorldMat;
float4x4 gViewMat;
float4x4 gProjMat;

float4 gLightPos;
float4 gViewPos;

struct VS_INPUT
{
   float4 pos : POSITION;
   float3 normal : NORMAL;
   float2 uv : TEXCOORD0;
};

struct VS_OUTPUT
{
   float4 pos : POSITION;
   float2 uv : TEXCOORD0;
   float3 diffuse : TEXCOORD1;
   float3 reflection : TEXCOORD2;
   float3 viewDir : TEXCOORD3;
};

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 - gViewPos.xyz;
   output.viewDir = normalize( viewDir);
   
   output.pos = mul( output.pos, gViewMat);
   output.pos = mul( output.pos, gProjMat);
   
   float3 worldNormal = mul( input.normal, gWorldMat);
   worldNormal = normalize( worldNormal);
   output.diffuse = dot( -lightDir, worldNormal);
   
   output.reflection = reflect( lightDir, worldNormal);
   
   output.uv = input.uv;
   
   return( output );
   
}

//------------------------------------------------------------

sampler2D DiffuseSampler;
sampler2D SpecularSampler;

float3 gLightColor;

struct PS_INPUT
{
   float2 uv : TEXCOORD0;
   float3 diffuse : TEXCOORD1;
   float3 reflection : TEXCOORD2;
   float3 viewDir : TEXCOORD3;
};

float4 ps_main( PS_INPUT input) : COLOR
{  
   float4 albedo = tex2D(DiffuseSampler, input.uv);
   float3 diffuse = gLightColor * albedo.rgb * saturate( input.diffuse);
      
   float3 specular = 0;
   
   if( diffuse.x > 0)
   {
      float3 reflection = normalize( input.reflection);
      float3 viewDir = normalize( input.viewDir);
      
      specular = dot( reflection, -viewDir);
      specular = saturate( specular);
      
      specular = pow( specular, 20);
      
      float4 specularIntensity = tex2D(SpecularSampler, input.uv);
      specular = gLightColor * specularIntensity.rgb * specular;
   }
   
   float3 ambient = float3( 0.1f, 0.1f, 0.1f) * albedo;
   
   return( float4( ambient + specular + diffuse, 1.0f) );
}

´Ù¿î·Îµå : SpecularMapping.rfx

SpecularMappling.rfx Çà·ÄÀ» ¾Æ·¡¿Í °°ÀÌ ¼öÁ¤Çغ¸ÀÚ.

¿ùµå Çà·Ä, ºä Çà·Ä, ÇÁ·ÎÁ§¼Ç Çà·ÄÀ» Çѹø¿¡ °è»êÇϱâ À§ÇØ gWorldViewProjMat Çà·ÄÀ» ÀÌ¿ëÇÏÀÚ.
Á¤Á¡ ¼ÎÀÌ´õ °è»ê½Ã lightDir, ViewDirÀ» °è»êÇϱâ À§ÇØ ¿ùµå gWorldMat´Â ±×´ë·Î µÐ´Ù.

´Ù¿î·Îµå : SpecularMapping2.rfx

simpleLighting2.rfx ¼ÎÀÌ´õ Äڵ忡¼­ ¿ùµå Çà·Ä, ºä Çà·Ä, ÇÁ·ÎÁ§¼Ç Çà·ÄÀ» ¹Ì¸® °è»êÇؼ­ ÇϳªÀÇ Çà·Ä¸¸ Àü´ÞÇØ º¸ÀÚ.
gWorldViewProjMat Çà·ÄÀ» ÅëÇؼ­ °ø°£ Çà·ÄÀ» Àü´Þ ÇØÁØ´Ù.

¿ùµå°ø°£À» ¿ÀºêÁ§Æ® °ø°£À¸·Î º¯È¯ ÇÒ·Á¸é ¿ùµå Çà·ÄÀÇ ¿ªÇà·ÄÀ» °öÇÏ¸é µÈ´Ù.

float3 objectLightPos = mul( gWorldLightPos, gInvWorldMat)

simpleLight2.rfx
struct VS_INPUT
{
   float4 pos : POSITION;
   float3 normal : NORMAL;
};

float4x4 gWorldViewProjMat;
float4x4 gInvWorldMat;

float4 gWorldLightPos;


struct VS_OUTPUT
{
   float4 pos : POSITION;
   float3 diffuse : TEXCOORD1;
};

VS_OUTPUT vs_main( VS_INPUT input )
{
   VS_OUTPUT output;

   output.pos = mul( input.pos, gWorldViewProjMat);
   
   float3 objectLightPos = mul( gWorldLightPos, gInvWorldMat);
   float3 lightDir = normalize(input.pos.xyz - objectLightPos);
   
   output.diffuse = dot( -lightDir, input.normal);
   
   return( output );
}

//------------------------------------------------------------

struct PS_INPUT
{
   float3 diffuse : TEXCOORD1;
};

float4 ps_main( PS_INPUT input) : COLOR
{   
   float3 diffuse = saturate( input.diffuse);
      
   return float4( diffuse, 1.0f);
}

´Ù¿î·Îµå : simpleLighting2.rfx