'Shader'에 해당되는 글 13건

  1. 2014.05.28 Lighting - Specular

<Vertex Shader>

 

float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;

float4 gWorldLightPosition;  // World 상의 Light의 위치(위치는 곧 방향) //
float4 gWorldCameraPosition; // World 상의 Camera의 위치(위치는 곧 방향) //

struct VS_INPUT
{
    float4 mPosition : POSITION;
    float3 mNormal   : NORMAL; // Vertex Shader에서 난반사를 표현하기 위해 Normal정보를 받는다 //
};


struct VS_OUTPUT
{
    float4 mPosition     : POSITION;
    float3 mDiffuse      : TEXCOORD1;
    float3 mViewDir      : TEXCOORD2;
    float3 mReflection   : TEXCOORD3;
};


VS_OUTPUT vs_main(VS_INPUT Input)
{
    VS_OUTPUT Output;
     
    Output.mPosition  = mul(Input.mPosition, gWorldMatrix);
     
   // Vertex에서 보는 Light의 방향 //
   float3 lightDir = Output.mPosition.xyz - gWorldLightPosition.xyz; // Light에서 Vertex방향으로 향함 //
   lightDir = normalize(lightDir); // 정규화 //
  
   // Vertex에서 보는 Light의 방향 //
   float3 viewDir = normalize(Output.mPosition.xyz - gWorldCameraPosition.xyz);
   Output.mViewDir = viewDir;
  
   // Normal을 World 공간으로 이동 //
   float3 worldNormal = mul(Input.mNormal, (float3x3)gWorldMatrix);
   worldNormal = normalize(worldNormal);
  
    Output.mPosition = mul(Output.mPosition, gViewMatrix);
    Output.mPosition = mul(Output.mPosition, gProjectionMatrix);
     
   // dot은 실수 하나 이지만 float3에 넣으면 같은 성분으로 모두 채워짐 //
   // -lightDir : Vertex에서 Light를 보는 방향을 변경 //
   Output.mDiffuse = dot(-lightDir, worldNormal);
   Output.mReflection = reflect(lightDir, worldNormal);
  
   return Output;
}


 

<Pixel Shader>

 

struct PS_INPUT
{
    float3 mDiffuse     : TEXCOORD1; // Vertex Shader에서 받아온 난반사광 //
    float3 mViewDir     : TEXCOORD2;
   float3 mReflection : TEXCOORD3;
};

float4 ps_main(PS_INPUT Input) : COLOR
{
   // saturate : 0이하는 0, 1이상은 1로 만들어줌 //
   // dot은 -1까지 나오니 saturate 사용하자 //
   float3 diffuse = saturate(Input.mDiffuse);
  
   //normalize 되어 있지만 보간을 거치면서 값이 흐틀러질 수 있음 //
   float3 reflection = normalize(Input.mReflection);
   float3 viewDir     = normalize(Input.mViewDir);
  
   float3 specular = 0;
   if (diffuse.x > 0) // 값이 모두 같으므로 0이하는 어둠이기에 생략 //
   {
       specular = saturate(dot(reflection, -viewDir)); // 스페큘러도 0~1 안으로 설정 //
      specular = pow(specular, 20.0f); // pow 거듭제곱 (pow로 스페큘러값을 조절 할 수 있음) //
   }
  
   float3 ambient = float3(0.1f, 0.1f, 0.1f); // 환경광을 넣음 //
  
   return float4(ambient + diffuse + specular, 1); // float3를 float4로 변경 //
   //(합이 1이 넘어도 알아서 1이됨) //
}

 

'Shader > HLSH Shader 공부' 카테고리의 다른 글

Lighting  (0) 2014.05.22
TextureMapping  (0) 2014.05.22
Color  (0) 2014.05.15
Posted by Hwanggoon
,