¼ÎÀÌ´õ ÀÔ¹®1

Å÷ ¼ÎÀÌ´õ

shader_basic.html Àå¿¡ ³ª¿Â simpleLighting2.rfx ¼ÎÀÌ´õ¿¡ Å÷ È¿°ú¸¦ Ãß°¡ÇÑ´Ù.
º°µµÀÇ ÅؽºÃÄ ¾øÀÌ  Ä®¶ó°ªÀ» 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ´Ü¿ì¸®·Î °è»ê ÇÒ °ÍÀÌ´Ù.
¿Ü°û¶óÀÎÀº ¾ø´Ù.

°è»êÀº Çȼ¿ ¼ÎÀÌ´õ¿¡ ´ÙÀ½ ÇÑÁÙ¸¸ Ãß°¡ÇÑ´Ù.

diffuse = ceil( diffuse * 5) / 5.0f

ceill ¸í·ÉÀº ¹«Á¶°Ç ¿Ã¸² ¸í·É¾îÀÌ´Ù.

0.2 ´ÜÀ§·Î Áõ°¡°¡ ÇÊ¿äÇϱ⠶§¹®¿¡ 1/0.2 = 5 ÀÌ´Ù.
°ö°ú ¿Ã¸²ÈÄ¿¡ ³ª´²ÁÖ¸é °£°Ý ¸¸Å­ ¼öÄ¡´Â Áõ°¡ ÇÑ´Ù.

0.4 ´ÜÀ§·Î Áõ°¡°¡ ÇÊ¿äÇÏ´Ù¸é 1/0.4 = 2.5 ÀÌ´Ù.

Toon Shader
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);
   
   diffuse = ceil( diffuse * 5) / 5.0f;
      
   return float4( diffuse, 1.0f);
}

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

 

EnvironmentMap

¾Æ·¡ ±×¸²Àº ȯ°æ¸Ê¿¡¼­ Åؼ¿À» ±¸ÇÏ´Â ¿ø¸®ÀÌ´Ù.
Ä«¸Þ¶ó º¤ÅÍÀÇ ¹Ý»çº¤Å͸¦ texCube¿¡ ³Ñ°ÜÁØ´Ù.

NormalMapping.rfx¿¡ ±â´ÉÀ» Ãß°¡ÇÑ´Ù.

ȯ°æ¸ÊÀ» ÅؽºÃĸ¦ ·»´õ¸ùÅ° »ùÇÿ¡¼­ Ãß°¡ÇÑ´Ù.
Add Texture > Add Cubemap > Snow.dds

ȯ°æ¸Ê ÅؽºÃÄ ¿ÀºêÁ§Æ®¸¦ ´õºí Ŭ¸¯Çؼ­ D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER¸¦ D3DTEXF_LINEAR·Î º¯°æÇÑ´Ù.

Á¤Á¡ ¼ÎÀÌ´õ´Â Ãß°¡ ÇÒ Äڵ尡 ¾ø°í Çȼ¿¼ÎÀÌ´õ¿¡¸¸ Äڵ带 Ãß°¡ ÇÒ °ÍÀÌ´Ù.

ÀÔ¹æüÀ̹ǷΠ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇÑ´Ù.

Çȼ¿¼ÎÀÌ´õ ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ ÁøÇàÇÑ´Ù.

  • ȯ°æ¸Ê ¼±¾ð samplerCUBE EnvironmentSampler;
  • Ä«¸Þ¶ó µð·º¼ÇÀ» ÀÌ¿ëÇÏ¿© ȯ°æ¸ÊÀ» ±¸ÇÑ´Ù. if¹® ¾È¿¡ ÀÖ´Â viewDirÀ» Á¶°Ç¹® ¹ÛÀ¸·Î »«´Ù.
  • Ä«¸Þ¶óÀÇ ¹Ý»ç º¤ÅÍ ±¸Çϱâ float3 viewReflect = reflect( viewDir, worldNormal)
  • ȯ°æ¸ÊÀÇ Åؼ¿ ±¸Çϱâ float3 environment = texCUBE( EnvironmentSampler, viewReflect).rgb
  • ȯ°æ¸Ê Åؼ¿ °á°ú¿¡ ´õÇϱâ return float4( ambient + specular + diffuse + environment*0.5f, 1.0f)

ȯ°æ¸Ê °ª¿¡ 0.5¸¦ °öÇÑ °ÍÀº °­µµ¸¦ Á¶Á¤ÇÏ´Â °ÍÀÌ´Ù. ¾î¶²°ªÀ» ´ëÀÔÇÏ´õ¶óµµ »ó°ü¾ø´Ù.
³ë¸Ö¸Ê ¶§¹®¿¡ ȯ°æ¸ÊÀÌ Àß ¾Èº¸À̹ǷΠÆòÆòÇÏ°Ô º¸À̵µ·Ï Çϱâ À§ÇØ tangentNormal = float3( 0, 0, 1)À¸·Î ¼³Á¤ÇÏ¿´´Ù.

Environment
float4x4 gWorldMat;
float4x4 gWorldViewProjMat;

float4 gLightPos;
float4 gViewPos;

struct VS_INPUT
{
   float4 pos : POSITION;
   float3 normal : NORMAL;
   float2 uv : TEXCOORD0;
   float3 tangent : TANGENT;
   float3 binoraml : BINORMAL;
};

struct VS_OUTPUT
{
   float4 pos : POSITION;
   float2 uv : TEXCOORD0;
   float3 lightDir : TEXCOORD1;
   float3 viewDir : TEXCOORD2;
   float3 T : TEXCOORD3;
   float3 B : TEXCOORD4;
   float3 N : TEXCOORD5;
};

VS_OUTPUT vs_main( VS_INPUT input )
{
   VS_OUTPUT output;

   output.pos = mul( input.pos, gWorldViewProjMat);
   
   output.uv = input.uv;
   
   float4 worldPos = mul( input.pos, gWorldMat);
   
   float3 lightDir = worldPos - gLightPos.xyz;
   output.lightDir = normalize( lightDir);
   
   float3 viewDir = worldPos - gViewPos.xyz;
   output.viewDir = normalize( viewDir);
   
   float3 worldNormal = mul( input.normal, (float3x3)gWorldMat);
   output.N = normalize( worldNormal);
   
   float3 worldTangent = mul( input.tangent, (float3x3)gWorldMat);
   output.T = normalize( worldTangent);
   
   float3 worldBinormal = mul( input.binoraml, (float3x3)gWorldMat);
   output.B = normalize( worldBinormal);
   
   return output;   
}

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

sampler2D DiffuseSampler;
sampler2D SpecularSampler;
sampler2D NormalSampler;
samplerCUBE EnvironmentSampler;

struct PS_INPUT
{
   float2 uv : TEXCOORD0;
   float3 lightDir : TEXCOORD1;
   float3 viewDir : TEXCOORD2;
   float3 T : TEXCOORD3;
   float3 B : TEXCOORD4;
   float3 N : TEXCOORD5;
};

float3 gLightColor;

float4 ps_main( PS_INPUT input) : COLOR
{
   float3 tangentNormal = tex2D( NormalSampler, input.uv).xyz;
   tangentNormal = normalize( tangentNormal * 2 - 1);
   
   //for test environment map
   tangentNormal = float3( 0, 0, 1);  
   
   float3x3 TBN = float3x3( normalize( input.T),
                            normalize( input.B),
                            normalize( input.N));

   TBN = transpose( TBN);
   float3 worldNormal = mul( TBN, tangentNormal);
     
   float4 albedo = tex2D(DiffuseSampler, input.uv);
   float3 lightDir = normalize( input.lightDir);
   float3 diffuse = saturate( dot( worldNormal, -lightDir));
   diffuse = gLightColor * albedo.rgb * diffuse;
      
   float3 specular = 0;
   
   float3 viewDir = normalize( input.viewDir);
   
   if( diffuse.x > 0)
   {
      float3 reflection = reflect( lightDir, worldNormal);
            
      specular = dot( reflection, -viewDir);
      specular = saturate( specular);
      
      specular = pow( specular, 20);
      
      float4 specularIntensity = tex2D(SpecularSampler, input.uv);
      specular = gLightColor * specularIntensity.rgb * specular;
   }
   float3 viewReflect = reflect( viewDir, worldNormal);
   float3 environment = texCUBE( EnvironmentSampler, viewReflect).rgb;
   
   float3 ambient = float3( 0.1f, 0.1f, 0.1f) * albedo;
   
   return float4( ambient + specular + diffuse + environment*0.5f, 1.0f);
}

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