Çȼ¿ ¼ÎÀÌ´õ HLSL ±âÃÊ

 

À̹øÀå¿¡¼­´Â Çȼ¿ HLSLÀÌ´Ù.   shader8.0   2Àå shader9.0 2ÀåÀ» º¸°í ¿À¸é µµ¿òÀÌ µÉ°ÍÀÌ´Ù.
ÀÌÀå ¿ª½Ã ÄÚµå ±¸ÇöÇÑÁö ¿À·¡ µÇ¾î¼­ ´ëÃæ ÈÄ´Ú´Ú ³Ñ¾î°¥ °Í °°´Ù.

 1) ¼ÎÀÌ´õ º¯¼ö ¼±¾ð

LPDIRECT3DPIXELSHADER9  g_hPShader = 0;  //Çȼ¿ ¼ÎÀÌ´õÀÇ ÇÚµé 
LPD3DXCONSTANTTABLE     g_pPixelConstantTable = 0; //Çȼ¿ »ó¼öÅ×À̺í Á¢±Ù ÇÚµé

Çȼ¿ ¼ÎÀÌ´õ¿¡¼­´Â µð¹ÙÀ̽º ÀÎÅÍÆäÀ̽ºÀÇ »ó¼ö Àü´Þ ÇÔ¼ö¸¦ ÅëÇØ »ó¼ö °ªÀ» Àü´ÞÇßÁö¸¸ HLSL¿¡¼­´Â LPD3DXCONSTANTTABLE ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ »ó¼ö¸¦ Àü´ÞÇؾßÇÑ´Ù.

2) ¼ÎÀÌ´õ »ý¼º

HRESULT CreateShader()
{
	//http://www.fairyengine.com/articles/hlsl2sided_fr.htm  ÂüÁ¶

	const char szHlslShader[] =
/*
	"ps.1.1							        \n"
	//"def c2, 0.3333f, 0.59f, 0.11f, 0.0f  \n"
	"tex t0									\n"
	"dp3 r0, t0, c2							\n";
*/
"   sampler   baseTex;                                                              \n"
"   float4    cColor;                                                               \n"
"	                                                                                \n"
"   sampler Sampler = sampler_state                                                 \n"
"   {                                                                               \n"
"       Texture   = (baseTex);                                                      \n"
"       MipFilter = LINEAR;                                                         \n"
"       MinFilter = LINEAR;                                                         \n"
"       MagFilter = LINEAR;                                                         \n"
"   };                                                                              \n"
"                                                                                   \n"
"   struct PS_INPUT                                                                 \n"
"   {                                                                               \n"
"      float4  Color   : COLOR0;                                                    \n"  
"      float2  Tex0    : TEXCOORD0;                                                 \n"
"   };                                                                              \n"
"                                                                                   \n"
"   struct PS_OUTPUT                                                                \n" 
"   {                                                                               \n"
"      float4  Color   : COLOR;                                                     \n"     
"   };                                                                              \n"
"	                                                                                \n"
"   PS_OUTPUT PixelShader_main(PS_INPUT In)                                         \n"
"   {                                                                               \n"
"      PS_OUTPUT Out = (PS_OUTPUT) 0;                                               \n"
"      //float4    cColor = { 0.3333f, 0.59f, 0.11f, 0.0f };                          \n"
"                                                                                   \n"
"      Out.Color = tex2D(Sampler, In.Tex0) * In.Color;                              \n" 
"      Out.Color = dot(Out.Color, cColor);                                          \n"
"      return Out;                                                                  \n"
"   }                                                                               \n"
"";
 
	ID3DXBuffer* pShaderBuffer;
	ID3DXBuffer* pShaderErrors;
	if (FAILED(D3DXCompileShader(szHlslShader, sizeof(szHlslShader), 0, NULL,
"PixelShader_main", "ps_1_1", D3DXSHADER_DEBUG,
&pShaderBuffer, &pShaderErrors, &g_pPixelConstantTable))) { char* str = (char*)pShaderErrors->GetBufferPointer(); return E_FAIL; } if (FAILED(g_pd3dDevice->CreatePixelShader((DWORD *)pShaderBuffer->GetBufferPointer(), &g_hPShader))) return E_FAIL; _RELEASE_(pShaderBuffer); return S_OK; }

HLSL ¼³¸íÀº ¸¶Áö¸·¿¡ ÇÏ°Ú´Ù.
D3DXAssembleShader ´ë½Å D3DXCompileShader¸¦ »ç¿ëÇÏ¿© ¼ÎÀÌ´õ¸¦ ÄÄÆÄÀÏÇÑ´Ù.
¼Ò½º º¸°í ÀßÀÌÇØÇϱ⠹ٶõ´Ù. (... ¼Ò½º ÀÛ¼ºÇÑÁö ¿À·¡ µÇ¾î¼­ ¿ª½Ã ±¸ÂúÀ½....)

3) ·»µå¸µ
HRESULT Render3D ()
{
	HRESULT hr;

	D3DXMATRIX	matTranslation;

	// Clear the scene
	g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
		                                D3DCOLOR_XRGB(150,150,255), 1.0f, 0 );
	g_pd3dDevice->BeginScene();

	D3DXMatrixIdentity( &matTranslation );
	g_pd3dDevice->SetTransform(D3DTS_WORLD, &matTranslation);


	g_pd3dDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(MYVERTEX));
	g_pd3dDevice->SetFVF(D3DFVF_MYVERTEX);

	//Çȼ¿ ¼ÎÀÌ´õ ¼³Á¤
	//ÂüÁ¶:  http:/www.codesampler.com/dx9src.html
	//sampler¸¦ Çϳª ÀÌ»ó Á¤ÀÇ ÇÑ´Ù¸é, Çȼ¿ ¼ÎÀÌ´õÀÇ »ó¼ö Å×À̺íÀ» Á¶»çÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.
    //Çϵå¿þ¾î¿¡ ¸ÊÇÎ µÇ¾î ÀÖ´Â ÅؽºÃÄ ½ºÅ×ÀÌÁöÀÇ sampler's ASCII nameÀ» »ç¿ëÇÑ´Ù.
	//¿©±â¼­ »ç¿ëÇÏ´Â Çȼ¿¼ÎÀÌ´õ´Â °£´ÜÇÏ´Ù. 
	//¿ì¸®´Â ÀÌ¹Ì ÅؽºÃÄ°¡ ½ºÅ×ÀÌÁö 0À¸·Î ³¡³­´Ù´Â °ÍÀ» ¾Ë°í Àֱ⠶§¹®¿¡ ´ÙÀ½ ÇÑÁÙ¸¸ ºÎ¸£¸é µÈ´Ù.
    //
	// g_pd3dDevice->SetTexture( 0, g_pTexture );
	//
	// "Sampler"¸¦ ¼±¾ðÇÏÁö ¾Ê°í "baseTex¸¸ ¼±¾ðÇß´Ù¸é, GetConstantByName()¿¡ "baseTex"¸¦ Àû´Â´Ù.
/*
	D3DXHANDLE  handle = g_pPixelConstantTable->GetConstantByName(NULL, "Sampler");
	if(handle)
	{
		D3DXCONSTANT_DESC constDesc;
		UINT count;

		g_pPixelConstantTable->GetConstantDesc(handle, &constDesc, &count);

		if(constDesc.RegisterSet == D3DXRS_SAMPLER)
			g_pd3dDevice->SetTexture(constDesc.RegisterIndex, g_pTexture);
	}
	else  
*/
		g_pd3dDevice->SetTexture( 0, g_pTexture );


    float fColorConstant[4] = { 0.3333f, 0.59f, 0.11f, 0.0f};
	g_pPixelConstantTable->SetVector(g_pd3dDevice, "cColor", (D3DXVECTOR4 *)fColorConstant);
	g_pd3dDevice->SetPixelShader(g_hPShader);

	g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

    //Clear texture
	g_pd3dDevice->SetTexture( 0, NULL );
	
	g_pd3dDevice->EndScene();
	hr = g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

	return hr;
}

                g_pd3dDevice->SetTexture( 0, g_pTexture );

´Ù¸¥ HLSLÀ» Âü°íÇϸé ÅؽºÃijª »ùÇ÷¯¸¦ ³Ñ°ÜÁÖ±â À§ÇØ º¹ÀâÇÏ°Ô »ç¿ëÇÏ°í ÀÖÀ» °ÍÀÌ´Ù. ¿ì¸®´Â ¿©±â¼­ ÀÌ·¸°Ô °£´ÜÇÏ°Ô »ç¿ëÇÒ±î. ±× ÀÌÀ¯´Â ´ÙÀ½°ú °°´Ù.

***Çȼ¿ ¼ÎÀÌ´õ ÅؽºÃijª ¼ÀÇ÷¯ ÁöÁ¤Çϱâ

ÂüÁ¶: http:/www.codesampler.com/dx9src.html
sampler¸¦ Çϳª ÀÌ»ó Á¤ÀÇ ÇÑ´Ù¸é, Çȼ¿ ¼ÎÀÌ´õÀÇ »ó¼ö Å×À̺íÀ» Á¶»çÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.
Çϵå¿þ¾î¿¡ ¸ÊÇÎ µÇ¾î ÀÖ´Â ÅؽºÃÄ ½ºÅ×ÀÌÁöÀÇ sampler's ASCII nameÀ» »ç¿ëÇÑ´Ù.
¿©±â¼­ »ç¿ëÇÏ´Â Çȼ¿¼ÎÀÌ´õ´Â °£´ÜÇÏ´Ù.
¿ì¸®´Â ÀÌ¹Ì ÅؽºÃÄ°¡ ½ºÅ×ÀÌÁö 0À¸·Î ³¡³­´Ù´Â °ÍÀ» ¾Ë°í Àֱ⠶§¹®¿¡ ´ÙÀ½ ÇÑÁÙ¸¸ ºÎ¸£¸é µÈ´Ù. g_pd3dDevice->SetTexture( 0, g_pTexture );
"Sampler"¸¦ ¼±¾ðÇÏÁö ¾Ê°í "baseTex¸¸ ¼±¾ðÇß´Ù¸é, GetConstantByName()¿¡ "baseTex"¸¦ Àû´Â´Ù.

±×·¸±â ¶§¹®¿¡ ¿©±â¼­ ÅؽºÃĸ¦ ÁöÁ¤ÇÏ´Â µÎ ÄÚµå´Â ¶È°°Àº °á°ú¸¦ °¡Á®¿Ã°ÍÀÌ´Ù.

        g_pd3dDevice->SetTexture( 0, g_pTexture );

        D3DXHANDLE  handle = g_pPixelConstantTable->GetConstantByName(NULL, "Sampler");
        if(handle)
        {
                D3DXCONSTANT_DESC constDesc;
                UINT count;

                g_pPixelConstantTable->GetConstantDesc(handle, &constDesc, &count);
                if(constDesc.RegisterSet == D3DXRS_SAMPLER)
                        g_pd3dDevice->SetTexture(constDesc.RegisterIndex, g_pTexture);
        } 

g_pPixelConstantTable->SetVector(g_pd3dDevice, "cColor", (D3DXVECTOR4 *)fColorConstant)¸¦ ÅëÇؼ­ Èæ¹é »ó¼ö °ªÀ» ³Ñ°ÜÁØ´Ù.

4) ¼Ò¸ê

	    
	_RELEASE_(g_hPShader);
	_RELEASE_(g_pPixelConstantTable);

g_pPixelConstantTableµµ ¼Ò¸ê ½ÃŲ´Ù.
 

5) HLSL ¼³¸í

sampler   baseTex;  
float4     cColor;   

sampler Sampler = sampler_state                            
{                                                          
    Texture   = (baseTex);                                 
    MipFilter = LINEAR;                                    
    MinFilter = LINEAR;                                    
    MagFilter = LINEAR;                                    
};                                                         

struct PS_INPUT                                            
{                                                          
   float4  Color   : COLOR0;                               
   float2  Tex0    : TEXCOORD0;                            
};                                                         

struct PS_OUTPUT                                           
{                                                          
   float4  Color   : COLOR;                                
};                                                         

                                                          
PS_OUTPUT PixelShader_main(PS_INPUT In)                    
{                                                          
   PS_OUTPUT Out = (PS_OUTPUT) 0;                          
 
   Out.Color = tex2D(Sampler, In.Tex0) * In.Color;         
   Out.Color = dot(Out.Color, cColor);                     
   return Out;                                             
}
    

baseText, cColor¸¦ ¼±¾ðÇÏ¿© »ó¼ö¶ó´Â °ÍÀ» ³ªÅ¸³½´Ù
sampler Sampler¸¦ ¼±¾ðÇÏ¿© »ùÇ÷¯¸¦ ¸¸µé°í PS_INPUT ±¸Á¶Ã¼·Î ÀÔ·ÂÀ» PS_OUTPUTÀ¸·Î Ãâ·ÂÀ» ¼±¾ðÇÑ´Ù.
 
Out.Color = tex2D(Sampler, In.Tex0) * In.Color;¿¡ º¸¸é »ùÇ÷¯¸¦ ³Ñ°ÜÁÖ°í ÀÖ´Ù »ùÇ÷¯°¡ ¼±¾ðµÇ¾î ÀÖÁö ¾Ê´Ù¸é baseTex¸¦ ³Ñ°ÜÁÖ¾î ÅؽºÃĸ¦ ·ÎµùÇÑ´Ù. ¼ÎÀÌ´õ ¾î¼Àºí¸®¾î¿¡¼­´Â dp3·Î ³»Àû°öÀ» ÇÞÁö¸¸ HLSL¿¡¼­´Â dot·Î ³»Àû°öÀ» ÇÑ´Ù...

±×·³ Èæ¹é±×¸²ÀÌ Âº~~~ ÇÏ°í ³ª¿Ã°ÍÀÌ´Ù.

[Æß]
Microsoft DirectX 9 Programmable Graphics Pipeline - Á¤º¸¹®È­»ç
DirectX ½Ç½Ã°£ ·»´õ¸µ ½ÇÀü Å×Å©´Ð - Á¤º¸ ¹®È­»ç
http://www.t-pot.com