¹öÅؽº¼ÎÀÌ´õ HLSL ±âÃÊ

 

µåµð¾î HLSLÀÌ´Ù. shader8.0 1, 2Àå shader9.0 1, 2ÀåÀ» º¸°í ¿À¸é µµ¿òÀÌ µÉ°ÍÀÌ´Ù.
ÀÚ¼¼ÇÑ ¼³¸íÀº Ã¥¿¡¼­ Âü°íÇÏ°í ¾î¼Àºí¸®¾î ¸ð½ÀÀÇ ¼ÎÀÌ´õ¿Í HLSL¿¡ ´ëÇؼ­¸¸ ¾Ë¾Æº¸ÀÚ.
¼Ò½º¸¦ ¸¸µçÁö ¿À·¡ µÇ¾î¼­ ¼³¸íÇϱ⵵ Èûµé°í, ¼ÖÁ÷È÷ ¸»Çؼ­ ±¸Â÷´ÏÁò ¶§¹®ÀÌ´Ù.

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

LPDIRECT3DVERTEXSHADER9	      g_hVShader = 0;  //¹öÅؽº ¼ÎÀÌ´õÀÇ ÇÚµé
LPDIRECT3DVERTEXDECLARATION9  g_pVertexDeclaration = 0;  //¹öÅؽº ¼ÎÀÌ´õ ¼±¾ðÀÚ
LPD3DXCONSTANTTABLE           g_pVertexConstantTable = NULL;  //¹öÅؽº »ó¼öÅ×À̺í Á¢±Ù ÇÚµé

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

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

HRESULT CreateShader()
{
	const char szHlslShader[] =
"   float4x4 worldViewProj : WORLDVIEWPROJ;                                         \n"
"                                                                                   \n"
"   struct VS_OUTPUT                                                                \n"
"   {                                                                               \n"
"        float4 pos  : POSITION;                                                    \n"
"        float4 diff : COLOR0;                                                      \n"
"   };                                                                              \n"
"                                                                                   \n"
"   VS_OUTPUT VertexShader_main( float3 pos  : POSITION,  float4 diff : COLOR0)     \n"
"   {                                                                               \n"
"        VS_OUTPUT Out = (VS_OUTPUT)0;                                              \n"
"                                                                                   \n"
"        Out.pos = mul(float4(pos, 1), worldViewProj);                              \n"
"        Out.diff = diff;                                                           \n" 
"                                                                                   \n"
"        return Out;                                                                \n"
"   }                                                                               \n"
"";

	D3DVERTEXELEMENT9 Declaration[] =
	{
		{0, 0,  D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT,   D3DDECLUSAGE_POSITION, 0},
		{0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,   D3DDECLUSAGE_COLOR,    0},
		D3DDECL_END()
	};

    if( FAILED(g_d3d_Device->CreateVertexDeclaration( Declaration, &g_pVertexDeclaration )))
    {
		_RELEASE_(g_pVertexDeclaration);
		return E_FAIL;
    }

	ID3DXBuffer* pShaderBuffer;
	ID3DXBuffer* pShaderErrors;

	if (FAILED(D3DXCompileShader(szHlslShader, sizeof(szHlslShader), 0, NULL, 
					"VertexShader_main", "vs_1_1", D3DXSHADER_DEBUG, 
					&pShaderBuffer, &pShaderErrors, &g_pVertexConstantTable)))
	{
		char* str = (char*)pShaderErrors->GetBufferPointer();
		return E_FAIL;
	}

	if (FAILED(g_d3d_Device->CreateVertexShader((DWORD *)pShaderBuffer->GetBufferPointer(), &g_hVShader)))
		return E_FAIL;
	_RELEASE_(pShaderBuffer);
	return S_OK;
}

HLSL ¼³¸íÀº ¸¶Áö¸·¿¡ ÇÏ°Ú´Ù.
¹öÅؽº ¼±¾ðÀÚ´Â ¹öÅؽº ¼ÎÀÌ¿Í ´Ù¸¥Á¡ÀÌ ¾ø´Ù.

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

3) ·»µå¸µ
void MoveShip(float fx, float fy)
{
	D3DXMATRIX	mScale1, mRot1, mTran1, mResult1;
	D3DXMATRIX	mScale2, mRot2, mTran2, mResult2;
	D3DXMATRIX	mScale3, mRot3, mTran3, mResult3;

	//º»Ã¼
	//SRT
	D3DXMatrixScaling( &mScale1, 1.1f, 1.1f, 1.1f );
	D3DXMatrixRotationZ(&mRot1, D3DXToRadian(g_fDegree));
	D3DXMatrixTranslation( &mTran1, fx, fy, 0.0f);

	mResult1 = mScale1 * mRot1 * mTran1;
	if(g_pVertexConstantTable)
	{
		D3DXMATRIX ShaderMatrix = mResult1 * g_matCameraView * g_matProj;

		//Get the transpose
		g_pVertexConstantTable->SetMatrix(g_d3d_Device, "worldViewProj", &ShaderMatrix);

		//Pass the transposed matrix to the shader
		g_d3d_Device->SetVertexDeclaration( g_pVertexDeclaration);
		g_d3d_Device->SetVertexShader( g_hVShader);
		g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLESTRIP, 3, 2 );

		//°íÁ¤ ÆÄÀÌÇÁ¶óÀÎ º¹±¸
		g_d3d_Device->SetVertexShader(NULL);
		g_d3d_Device->SetFVF(D3DFVF_CUSTOMVERTEX);
	}
	else
	{
		g_d3d_Device->SetTransform( D3DTS_WORLD, &mResult1);
		g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLESTRIP, 3, 2 );
	}


	//Æ÷ž
	D3DXMatrixScaling( &mScale2, 1.0f, 1.0f, 1.0f );
	D3DXMatrixRotationZ(&mRot2, D3DXToRadian(g_fTurretDegree));
	D3DXMatrixTranslation( &mTran2, 0.0f, -0.7f, 0.0f );
	
    mResult2 = mScale2 * mRot2 * mTran2 * mResult1;
	g_d3d_Device->SetTransform( D3DTS_WORLD, &mResult2 );
	g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

	//Æ÷
	D3DXMatrixScaling( &mScale3, 0.1f, 0.3f, 1.0f );
	D3DXMatrixRotationZ(&mRot3, 0.0f);
	D3DXMatrixTranslation( &mTran3, 0.0f, -0.1f, -0.5f);

	mResult3 = mScale3 * mRot3 * mTran3 * mResult2;
	g_d3d_Device->SetTransform( D3DTS_WORLD, &mResult3 );
	g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLESTRIP, 3, 2 );
}

»ó¼ö Å×ÀÌºí º¯¼ö°¡ ¼±¾ðµÇ¾î ÀÖÀ» ¶§¸¸ HLSLÀ» ÅëÇÑ ·»µå¸µÀ» ÇÒ °ÍÀÌ´Ù.

g_pVertexConstantTable->SetMatrix()¸¦ ÅëÇØ ¼ÎÀÌ´õ·Î »ó¼ö¸¦ Àü´ÞÇÏ°í ÀÖ´Ù. ÀüÄ¡·Î º¯È¯ÇÏ´Â ºÎºÐÀÌ ¾ø´Ù.
¿Ö ÀüÄ¡·Î º¯È¯ ÇÏÁö ¾ÊÀ»±î?

¿­¿ì¼± ÆÑÅ·Àº ¸í·É ½½·ÔÀÇ Àý¾à»Ó¸¸ ¾Æ´Ï¶ó, ÀϹÝÀûÀ¸·Î »ó¼ö ·¹Áö½ºÅÍ °ø°£À» Àý¾àÇÑ´Ù.
±×¸®°í
Çà ¿ì¼±À̳ª ¿­ ¿ì¼± ¹æ½ÄÀ¸·Î ÆÐÅ·ÇÏ´Â °ÍÀº Çà·ÄÀÇ »ý¼ºÀÚ¿¡ ¾Æ¹«·± º¯È­°¡ ¾ø´Ù.(Áï ¾ðÁ¦³ª Çà ¿ì¼±¼øÀ§ ¹æ½ÄÀ¸·Î ÀÎÁöÇÏ°í Äڵ带 ÀÛ¼ºÇÏ¸é µÈ´Ù).

4) ¼Ò¸ê

	    
        _RELEASE_(g_hVShader);
        _RELEASE_(g_pVertexDeclaration);
        _RELEASE_(g_pVertexConstantTable);

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

5) HLSL ¼³¸í

float4x4 worldViewProj : WORLDVIEWPROJ;

struct VS_OUTPUT
{
      float4 pos  : POSITION;
      float4 diff : COLOR0;
}

VS_OUTPUT VertexShader_main( float3 pos  : POSITION,  float4 diff : COLOR0)
{
       VS_OUTPUT Out = (VS_OUTPUT)0;

       Out.pos = mul(float4(pos, 1), worldViewProj);
       Out.diff = diff;  

       return Out;
}

SetMatrix()¿¡¼­ ³Ñ±ä »ó¼ö¸¦ Àü´Þ¹Þ´Â´Ù. ÀüÄ¡·Î ¹Ù²Ü ÇÊ¿ä°¡ ¾ø´Ù.
ÀÔ·Â Ãâ·Â ·¹Áö½ºÅÍ¿¡ ´ëÇØ ½Å°æ¾²´Â°Ô ¸¹ÀÌ ÁØ °ÍÀ» ¾Ë¼öÀÖ´Ù.
ÀÔ·ÂÀ¸·Î À§Ä¡¿Í µðÇ»Áî Ä®¶ó°ªÀ» µé¾î¿Í¼­  VS_OUTPUTÀÇ °ªÀ» ¸®ÅÏÇÑ´Ù.

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