·¹½ºÅͶóÀÌÀú ´Ü°è¿¡¼­ º¸°£

¹öÅؽº ¼ÎÀÌ´õ¿Í Çȼ¿(ÇÁ·¹±×¸ÕÆ®) ¼ÎÀÌ´õ »çÀÌ¿¡´Â ·¹½ºÅͶóÀÌÀú ´Ü°è°¡ ÀÖ´Ù.
·¹½ºÅͶóÀÌÀú ´Ü°è¿¡¼­ ÇÏ´ÂÀÏÀº ´ÙÀ½°ú °°´Ù.

Ŭ¸®ÇÎ
¿ø±Ù ³ª´°¼À
µÞ¸é Á¦°Å
ºäÆ÷Æ® º¯È¯
½ºÄµ º¯È¯

½ºÄµ º¯È¯ ´Ü°è¿¡¼­ °¢ Á¤Á¡µéÀÇ ¼Ó¼ºÀ» º¸°£ÇÏ¿© Çȼ¿ ¼ÎÀÌ´õ¿¡ ³Ñ°Ü ÁØ´Ù.
Á¤Á¡ ¼Ó¼º position, color, uv, normalµîÀº º¸°£ µÇ¾î ÇÁ·¹±×¸ÕƮȭ µÈ´Ù.

Á¤Á¤ ¼ÎÀÌ´õÀÇ Ãâ·Â¿¡¼­ À§Ä¡µîÀÇ Á¤Á¡ ¼Ó¼ºÀ» ³Ñ°ÜÁÖ¸é Çȼ¿ ¼ÎÀÌ´õ¿¡¼­ ¹Þ´Â ÀÔ·ÂÀº º¸°£µÇ¾î¼­ ³Ñ¾î¿Â °ªÀÌ´Ù.
±×·¸±â ¶§¹®¿¡ Çȼ¿ ¼ÎÀÌ´õ¿¡¼­ ¹æÇâ º¤ÅÍ´Â º¸°£µÈ °ªÀ̱⠶§¹®¿¡ ´Ù½Ã ³ë¸Ö¶óÀÌÁî(normalize) ÇØÁà¾ß ÇÑ´Ù.

¿ùµå Æ÷Áö¼ÇÀ» Çȼ¿ ¼ÎÀÌ´õ·Î ³Ñ°Ü Ä®¶ó °ªÀ¸·Î Ãâ·Â Çغ¸ÀÚ.
½ÇÇà È­¸éÀ» º¸¸é ¹öÅؽº ¼ÎÀÌ´õ¿¡ ³Ñ±ä°Ç ¸î°³ ¾ÈµÇÁö¸¸ Çȼ¿¼ÎÀÌ´õ·Î ³Ñ¾î¿À±âÀü¿¡ º¸°£ÀÌ µÇ¾î ºÎµå·´°Ô º¸ÀδÙ.




Æò¸éÀ» left 1000, right 1000, top 1000, bottom 1000 »çÀÌÁî·Î ¸¸µç´Ù.  2000X2000 »çÀÌÁîÀÇ Æò¸éÀ» ¸¸µç´Ù.

bool RenderInit()
{
    float    fSizeX = 1000.0f;
    float    fSizeY = 1000.0f;
    
    CUSTOMVERTEX vertex[4];

    // Create the geometry
    vertex[0].x = -fSizeX/2;
    vertex[0].y = -fSizeY/2;
    vertex[0].z = 0.0f;
    vertex[0].nx = 0.0f;
    vertex[0].ny = 0.0f;
    vertex[0].nz = -1.0f;
    
    vertex[1].x = -fSizeX/2;
    vertex[1].y = fSizeY/2;
    vertex[1].z = 0.0f;
    vertex[1].nx = 0.0f;
    vertex[1].ny = 0.0f;
    vertex[1].nz = -1.0f;
 
    vertex[2].x = fSizeX/2;
    vertex[2].y = -fSizeY/2;
    vertex[2].z = 0.0f;
    vertex[2].nx = 0.0f;
    vertex[2].ny = 0.0f;
    vertex[2].nz = -1.0f;
    
    vertex[3].x = fSizeX/2;
    vertex[3].y = fSizeY/2;
    vertex[3].z = 0.0f;
    vertex[3].nx = 0.0f;
    vertex[3].ny = 0.0f;
    vertex[3].nz = -1.0f;
    
    g_dxDevice->CreateVertexBuffer(4 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &g_VertexBuffer, NULL);
    
    VOID* pVertices;
    g_VertexBuffer->Lock (0, sizeof(vertex), &pVertices, 0);
    memcpy (pVertices, vertex, sizeof(vertex));
    g_VertexBuffer->Unlock();

    return true;
}

Á¤Á¡ÀÇ ¿ùµå À§Ä¡¸¦ Çȼ¿ ¼ÎÀÌ´õ·Î ³Ñ±ä´Ù.

VSOutput VsMain( VSInput input )
{
    VSOutput output;

    output.pos = mul( float4(input.pos,1), matWVP );
    output.wpos = mul( float4(input.pos,1), matWorld );
    output.nor = input.nor;
    return output;
}  

¿ùµå À§Ä¡´Â º¸°£µÇ¾î ³Ñ¾î¿Â´Ù. 
Ä®¶ó·Î Ç¥½ÃÇϱâ À§ÇØ 0 ~ 1 »çÀÌ °ªÀ¸·Î ¸¸µé±â À§ÇØ 1000À¸·Î ³ª´²ÁØ´Ù.

PSOutput PsMain(PSInput input)                          
{                                                                
   PSOutput output = (PSOutput) 0;                                
   //float3 nor = normalize(input.nor);
  
   float4 pos = float4(input.wpos,1);
   pos.x = pos.x/1000.0f + 0.5f;
   output.color = pos.rrra;

   return output;                                                   
}

HLSLÀÇ Àüü ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

// world * view * projection
float4x4    matWVP;
float4x4    matWorld;
 
struct VSInput
{
    float3 pos : POSITION;
    float3 nor : POSITION;
};
 
struct VSOutput
{
    float4 pos : POSITION;
    float3 wpos : TEXCOORD0;
    float3 nor : TEXCOORD1;
};

struct PSInput                                                  
{    
    float3 wpos: TEXCOORD0;
    float3 nor: TEXCOORD1;
};                                                               
                                                                 
struct PSOutput                                                
{                                                                
    float4  color   : COLOR;                                      
}; 

 
VSOutput VsMain( VSInput input )
{
    VSOutput output;

    output.pos = mul( float4(input.pos,1), matWVP );
    output.wpos = mul( float4(input.pos,1), matWorld );
    output.nor = input.nor;
    return output;
}                                                       
                                                                 
PSOutput PsMain(PSInput input)                          
{                                                                
   PSOutput output = (PSOutput) 0;                                
   //float3 nor = normalize(input.nor);
  
   float4 pos = float4(input.wpos,1);
   pos.x = pos.x/1000.0f + 0.5f;
   output.color = pos.rrra;

   return output;                                                   
}

technique MeshTech
{
    pass P0
    {
        VertexShader = compile vs_3_0 VsMain();
        PixelShader = compile ps_3_0 PsMain();
    }
};

´Ù¿î·Îµå : dx9_shader.zip

Âü°í)
https://jidon333.github.io/blog/Rendering-pipeline
https: //bkjcr.tistory.com/entry/¼ÎÀÌ´õ-ÆÛ-Çȼ¿-¶óÀÌÆÃ-per-pixel-lighting
Ã¥: °ÔÀÓ ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ 3Â÷¿ø ±×·¡ÇȽº / È︪°úÇÐÃâÆÇ»ç / ±Û¾´ ÀÌ - ÇÑÁ¤Çö
125page