¹öÅؽº ¼ÎÀÌ´õ

DirextX 8.0ÀÇ tutorial10¿¡ ¹öÅؽº ¼ÎÀÌ´õ¸¦ Ãß°¡ÇÏ°Ú´Ù.

¿Ö ¼ÎÀÌ´õ¸¦ »ç¿ëÇÒ±î? À¯¿¬ÇÑ ÇÁ·Î±×·¡¹ÖÀÌ Ã¹Â° ¸ñÀûÀÌ°í, µÑ°°¡ ÃÖÀûÈ­ÀÌ´Ù.
2°¡Áö ÀÌÀ¯ ¸ðµÎ ¾ÆÁ÷ ¸Ó¸® ¼Ó¿¡ ¸Éµ¹±â¸¸ ÇÒ»Ó °¨ÀÌ ¿ÀÁö ¾Ê´Â´Ù.

À¯¿¬ÇÑ ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÑ ÀÌÀ¯´Â µ¥ÀÌÅÍ°¡ °íÁ¤ÆÄÀÌÇÁ ¶óÀÎÀ¸·Î µé¾î°¡´Â ´ë½Å¿¡ ÇÁ·Î±×·¡¹Ö °¡´ÉÇÑ GPU·Î µé¾î°¡±â ¶§¹®¿¡ ÀÌÀü¿¡ CPU¿¡¼­³ª ÇÏ´øÀÏÀ» GPU¿¡¼­ °¡´ÉÇÏ°Ô µÇ¾ú´Ù.

ÀÌ·± ÀÌÀ¯·Î ÃÖÀûÈ­¿¡µµ µµ¿òÀÌ µÈ´Ù. ±×·¡ÇÈ Ä«µå·Î º¸³»´Â µ¥ÀÌÅÍ·®µµ ÁÙÀÏ ¼ö ÀÖ°í, GPU´Â CPUº¸´Ù º¤ÅÍ ¿¬»êÀÌ ´õ ºü¸£±â ¶§¹®¿¡ °ÅÀÇ ´ëºÎºÐ ¾Õ¼±´Ù.

ÀÔ·Â º¤ÅÍ ·¹Áö½ºÅÍ:
µ¥ÀÌÅÍ°¡ µé¾î¿À´Â ·¹Áö½ºÅÍ·Î v0, v1, v2.......... v15±îÁö 16°³ÀÇ ÀÔ·Â ¹öÆÛ°¡ ÀÖ´Ù.
¼Î¾î´õ ¾î¼Àºí·¯¿¡¼­´Â v0, v1°ú °°ÀÌ »ç¿ëÇÏ°í
¼±¾ð¿¡¼­ »ç¿ëµÉ ¶§´Â ´ÙÀ½°ú d3d8types.hÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇ µÇ¾îÀÖ´Ù.

	 
	[¸®½ºÆ® 1]
	   
	#define D3DVSDE_POSITION 0
	#define D3DVSDE_BLENDWEIGHT 1 
	#define D3DVSDE_BLENDINDICES 2 
	#define D3DVSDE_NORMAL 3 
	#define D3DVSDE_PSIZE 4 
	#define D3DVSDE_DIFFUSE 5 
	#define D3DVSDE_SPECULAR 6 
	#define D3DVSDE_TEXCOORD0 7 
	#define D3DVSDE_TEXCOORD1 8 
	#define D3DVSDE_TEXCOORD2 9 
	#define D3DVSDE_TEXCOORD3 10 
	#define D3DVSDE_TEXCOORD4 11 
	#define D3DVSDE_TEXCOORD5 12 
	#define D3DVSDE_TEXCOORD6 13 
	#define D3DVSDE_TEXCOORD7 14 
	#define D3DVSDE_POSITION2 15 

»ó¼ö ·¹Áö½ºÅÍ:
¼ÎÀÌ´õ¿¡¼­ Àбâ Àü¿ëÀ¸·Î »ç¿ëµÇ´Â ·¹Áö½ºÅÍ·Î ¹öÅؽº ¼ÎÀÌ´õÀÇ ¸í·ÉÀÌ ½ÇÇàµÇ±â ÀÌÀü¿¡ »ó¼ö¸¦ ¹Ù²Ü ¼ö Àֱ⠶§¹®¿¡ ½ÇÁ¦·Î´Â ÇÔ¼ö¸¦ ¹Ù²Ù´Â º¯¼öÀÇ ¿ëµµ·Î »ç¿ëµÈ´Ù.
D3DCAP8 ±¸Á¶Ã¼ÀÇ MaxVertexShaderConst ¸â¹ö·Î »ç¿ë °¡´ÉÇÑ »ó¼öÀÇ ÃÖ´ë °¹¼ö¸¦ ¾Ë ¼ö ÀÖ´Ù.

ÁÖ¼Ò ·¹Áö½ºÅÍ:
»ó¼öµéÀ» À妽ºÇÒ ¼ö ÀÖ°Ô ÇØ Áִ Ưº°ÇÑ ¿£ÅÍƼÀÌ´Ù. ´õ ÀÌ»ó ¼³¸íÀº ³ªµµ ¸ð¸£±â ¶§¹®¿¡ ¹«½Ã...

Àӽà ·¹Áö½ºÅÍ:
°í±Þ¾ð¾îÀÇ Áö¿ªº¯¼ö ó·³ º¯¼ö°ªÀÌ º¸Á¸µÇÁö ¾Ê´Â´Ù.
r0, r1, r2............  r11 ó·³ ºÒ¸°´Ù.

Ãâ·Â ·¹Áö½ºÅÍ:
Ãâ·Â ·¹Áö½ºÅÍ·Î ³» º¸³»Áö ¾ÊÀ¸¸é È­¸é¿£ ¾Æ¹«°Íµµ º¸ÀÌÁö ¾ÊÀ»°ÍÀÌ´Ù.
Ãâ·Â ·¹Áö½ºÅÍÀÇ »ç¿ë ¿ëµµ´Â ´ÙÀ½°ú °°´Ù.

Ãâ·Âº¯¼ö

¼³¸í

oPos

º¯È¯µÈ È­¸é ÁÂÇ¥µé ¾ÈÀÇ Ãâ·Â À§Ä¡

oDn

2°³ÀÇ Ä÷¯ Ãâ·Â(oD1°ú oD2), °¢°¢Àº 4D º¤ÅÍÀÌ´Ù.

oTn

4°³ÀÇ ÅؽºÃ³ ÁÂÇ¥ Ãâ·Â(oT0ºÎÅÍ oT3±îÁö). °¢°¢Àº 4D º¤ÅÍÀÌ´Ù.

oFog

Ãâ·Â Æ÷±× °ª. ÀÌ°ÍÀº ÇϳªÀÇ FLOAT °ªÀ¸·Î Ãë±ÞµÈ´Ù.

oPts    

Ãâ·Â Á¡ Å©±â °ª. ÀÌ°ÍÀº ÇϳªÀÇ FLOAT °ªÀ¸·Î Ãë±ÞµÈ´Ù.

 

DirextX 8.0ÀÇ tutorial 10ÀÇ ¼Ò½º¸¦ ¹öÅؽº ¼ÎÀÌ´õ·Î ¼öÁ¤Çغ¸ÀÚ.
±»ÀÌ ¼ÎÀÌ´õ·Î ÇÒ ÇÊ¿ä¾øÁö¸¸ "Hello world!"·Î C¸¦ ¹è¿ï ¶§ ó·³ ½¬¿î°É·Î ½ÃÀÛÇغ¸ÀÚ.
ÀԷ·¹Áö½ºÅÍÀÇ °ªÀ» »ó¼ö·¹Áö½ºÅÍÀÇ °ªÀ¸·Î ¿¬»êÇÑ µÚ¿¡ Ãâ·Â·¹Áö½ºÅÍ·Î º¸³»ÁØ´Ù´Â°É ±â¾ïÇÏ¸é µÈ´Ù.

Ãâ·Â ·¹Áö½ºÅÍ  = »ó¼ö ·¹Áö½ºÅÍ («»Í) ÀÔ·Â ·¹Áö½ºÅÍ

DirextX 8.0ÀÇ tutorial 10¿¡ »õ·Ó°Ô Ãß°¡µÈ°Í¸¸ ¼³¸íÇÏ°Ú´Ù.

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

DWORD                                   g_hVShader = 0;  //¹öÅؽº ¼ÎÀÌ´õÀÇ ÇÚµé                                         

HANDLEÀÌ ¾Æ´Ï¶ó DWORD·Î ¹öÅؽº ¼ÎÀÌ´õÀÇ ÇÚµéÀ» ¼±¾ðÇÑ´Ù.

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

HRESULT CreateShader()
{
	const char szVertextShader[] =
	"vs.1.1                //¹öÀü Á¤º¸   \n"
	"dp4 oPos.x, v0, c0    //c0´Â x°ª    \n"
	"dp4 oPos.y, v0, c1    //c1Àº y°ª    \n"
	"dp4 oPos.z, v0, c2    //c2´Â z°ª    \n"
	"dp4 oPos.w, v0, c3    //w°ª         \n"
	"mov oD0,  v5          //²ÀÁöÁ¡ Ä®¶ó Àü´Þ\n";

	ID3DXBuffer* pShaderBuffer;
	ID3DXBuffer* pShaderErrors;

	if (FAILED(D3DXAssembleShader(szVertextShader, sizeof(szVertextShader) - 1, 0, NULL, &pShaderBuffer, &pShaderErrors)))
		return E_FAIL;

	DWORD Declaration[] =
	{
		D3DVSD_STREAM(0),
		D3DVSD_REG(D3DVSDE_POSITION,  D3DVSDT_FLOAT3),
		D3DVSD_REG(D3DVSDE_DIFFUSE,   D3DVSDT_D3DCOLOR),
		D3DVSD_END()
	};
	
	if (FAILED(m_pD3DDevice->CreateVertexShader(Declaration, (DWORD *)pShaderBuffer->GetBufferPointer(),
								   &g_ShaderHandle, 0)))
		return E_FAIL;
	_RELEASE_(pShaderBuffer);
}	    
	    

CreateShader()¸¦ RenderInit(), Áï ¹öÅؽº ¹öÆÛ »ý¼º ÀÌÀü¿¡ ½ÇÇàÇÑ´Ù.

D3DXAssembleShader°ú D3DXAssembleShaderFromFile 2°¡Áö°¡ Àִµ¥, ¼ÎÀÌ´õ°¡ °£´ÜÇϱ⠶§¹®¿¡ D3DXAssembleShader¸¦ »ç¿ëÇÏ¿© ¼ÎÀÌ´õ ÄÚµåÀÇ ÃʼÒÇÑ ¿¡·¯Ã¼Å©¿Í ÀÌÁøÄÚµå·Î ¸¸µé¸¦ ÀÖ´Ù.
pShaderBuffer´Â ´õ ÀÌ»ó ÇÊ¿äÇÏÁö ¾Ê±â ¶§¹®¿¡ ÇØÁ¦ÇÑ´Ù.

¼ÎÀÌ´õ ¹®¹ýÀº ¸¶Áö¸·¿¡ ¼³¸íÇÏ°Ú´Ù.

        DWORD Declaration[] =
        {
                D3DVSD_STREAM(0),
                D3DVSD_REG(D3DVSDE_POSITION,  D3DVSDT_FLOAT3),
                D3DVSD_REG(D3DVSDE_DIFFUSE,   D3DVSDT_D3DCOLOR),
                D3DVSD_END()
        };

CreateVertexShader()¿¡ Àü´ÞÇØÁÖ±â À§ÇÑ Declaration[]º¯¼ö¸¦ CUSTOMVERTEX  ±¸Á¶Ã¼¿Í ºñ½ÁÇÏ°Ô ¸¸µç´Ù
Declaration´Â D3DVSD_STREAM(0)¿¡¼­ ½ÃÀÛÇÏ¿© D3DVSD_END()À¸·Î ³¡³³´Ï´Ù.
½ºÆ®¸² 0¿¡¼­ ½ÃÀÛÇÏ°í ÀÖ½À´Ï´Ù.

±× »çÀÌ¿¡ ¼±¾ðµÇ¾î ÀÖ´Â °ÍÀº CUSTOMVERTEX ±¸Á¶Ã¼¿Í °°Àº ¼ø¼­·Î ¸®½ºÆ® 1ÀÇ ¼±¾ðÀ» ÀûµçÁö, ¼ýÀÚ¸¦ Àû°í,
µÎ ¹ø°´Â Å©±â¼±¾ðÀ» ÀûÀ¸¸é µÈ´Ù.

CreateVertexShader()·Î µð¹ÙÀ̽º »ó¿¡ ½ÇÁ¦ÀûÀ¸·Î ¼ÎÀÌ´õ ÀνºÅϽº¸¦ »ý¼ºÇÑ´Ù.

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  0
        g_d3d_Device->SetTransform( D3DTS_WORLD, &mResult1);
        g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLESTRIP, 3, 2 );
#else
        D3DXMATRIX ShaderMatrix = mResult1 * g_matCameraView * g_matProj;
        //Get the transpose
        D3DXMatrixTranspose(&ShaderMatrix, &ShaderMatrix);
        //Pass the transposed matrix to the shader
        g_d3d_Device->SetVertexShaderConstant(0, &ShaderMatrix, 4);
        g_d3d_Device->SetVertexShader(g_hVShader);        
        g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLESTRIP, 3, 2 );

        g_d3d_Device->SetVertexShader(D3DFVF_CUSTOMVERTEX);
#endif

        //Æ÷ž
        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 );
}

 

#if  0
        g_d3d_Device->SetTransform( D3DTS_WORLD, &mResult1);
        g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLESTRIP, 3, 2 );
#else
        D3DXMATRIX ShaderMatrix = mResult1 * g_matCameraView * g_matProj;
        //Get the transpose
        D3DXMatrixTranspose(&ShaderMatrix, &ShaderMatrix);
        //Pass the transposed matrix to the shader
        g_d3d_Device->SetVertexShaderConstant(0, &ShaderMatrix, 4);
        g_d3d_Device->SetVertexShader(g_hVShader);        
        g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLESTRIP, 3, 2 );

        g_d3d_Device->SetVertexShader(D3DFVF_CUSTOMVERTEX);
#endif


¹èÀÇ º»Ã¼¸¸ ¼ÎÀÌ´õ¸¦ »ç¿ëÇÏ°í ÀÖ´Ù.
#if ÀýÀ» ÁÖ¸ñÇÏÀÚ. ¿ì¸®°¡ ¸¸µç °£´ÜÇÑ ¼ÎÀÌ´õ Äڵ忡¼­ À̵¿À» ó¸®ÇØÁֱ⠶§¹®¿¡ SetTransform()À» ´õ ÀÌ»ó È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

´ë½Å ¿ùµå ¸ÞÆ®¸¯½º, ºä ¸ÞÆ®¸¯½º(Ä«¸Þ¶ó ºä ¸ÞÆ®¸¯½º), Åõ¿µ ¸ÞÆ®¸¯½º(Ä«¸Þ¶ó Åõ¿µ ¸ÞÆ®¸¯½º)¸¦ °öÇؼ­ ¼ÎÀÌ´õ·Î Àü´ÞÇØÁØ´Ù.
D3DXMATRIX ShaderMatrix = mResult1 * g_matCameraView * g_matProj;

¼ÎÀÌ´õ ³»ºÎ¿¡¼­´Â OPEN GL°ú °°Àº ¿­Çà·ÄÀ» »ç¿ëÇÏ°í Àֱ⠶§¹®¿¡ ¼ÎÀÌ´õ·Î Àü´ÞÇϱâ Àü¿¡ Çà Çà·Ä¿¡¼­ ¿­Çà·Ä·Î ¹Ù²Ù±â À§ÇØ ÀüÄ¡Çà·ÄÀ» »ç¿ëÇÑ´Ù.
D3DXMatrixTranspose(&ShaderMatrix, &ShaderMatrix);

¸ðµç º¯È¯ÀÌ ³¡³µÀ¸¸é ¼ÎÀÌ´õ·Î ³Ñ°ÜÁØ´Ù.
ù ¹ø° ÆĶó¸ÞÅÍ´Â »ó¼ö ·¹Áö½ºÅÍ c0¿¡¼­ ½ÃÀÛÇؼ­ ¼¼ ¹ø° ÆĶó¸ÞÅÍ 4°³ÀÇ »ó¼ö·¹Áö½ºÅ͸¦ »ç¿ëÇÑ´Ù(¿©±â¼­´Â  c3 ·¹Áö½ºÅͱîÁö »ç¿ë)
g_d3d_Device->SetVertexShaderConstant(0, &ShaderMatrix, 4);

¿ì¸®°¡ ÇÁ·Î±×·¡¹ÖÇÑ ¼ÎÀÌ´õ·Î ±×¸®±â À§ÇØ ¼ÎÀÌ´õ¸¦ ¼³Á¤ÇÑ´Ù.
g_d3d_Device->SetVertexShader(g_hVShader)

DrawPrimitive()¸¦ ÇØÁÖ°í ³ª¼­ ³ª¸ÓÁö´Â °íÁ¤ ÆÄÀÌÇÁ¶óÀÎÀ» »ç¿ëÇϱ⠶§¹®¿¡, °íÁ¤ ÆÄÀÌÇÁ¶óÀÎ ¼³Á¤À» ´Ù½Ã ÇØÁØ´Ù.
g_d3d_Device->SetVertexShader(D3DFVF_CUSTOMVERTEX); 

4) ¼Ò¸ê

    if ( g_hVShader != NULL )
    {
        g_d3d_Device->DeleteVertexShader( g_hVShader );
        g_hVShader = NULL;
    }

5) ¼ÎÀÌ´õ ÄÚµå ¼³¸í

vs.1.1

¼ÎÀÌ´õ ¹öÀüÀ» ¼³Á¤ÇÑ´Ù.

dp4 oPos.x, v0, c0
dp4 oPos.y, v0, c1
dp4 oPos.z, v0, c2
dp4 oPos.w, v0, c3
 

À§ÄÚµå´Â 1X4 º¤ÅÍÀÎ v0¿Í 4X4 º¤ÅÍ c0¸¦ °öÇØ ºä, Åõ¿µ Çà·ÄÀ» ±¸ÇÏ¿© Ãâ·Â ·¹Áö½ºÅÍ oPos¿¡ ³Ö´Â ÄÚµåÀÌ´Ù
ÀÌ ÄÚµå¿Í °°´Ù. ( = m4x4 oPos, v0, c0)

Çà·Ä½ÄÀ¸·Î º¸¸é ´ÙÀ½°ú °°´Ù.

                                                     ¦£c0.x c1.x c2.x c3.x ¦¤
[oPos.x oPos.y oPos.z oPos.w] = [v0.x v0.y v0.z v0.w]£üc0.y c1.y c2.y c3.y ¦¢
                                                     ¦¢c0.z c1.z c2.z c3.z ¦¢
                                                     ¦¦c0.w c1.w c2.w c3.w ¦¥

mov oD0,  v5

µðÇ»Áî »ö»óÀ» Ãâ·ÂÇÑ´Ù.

½ÇÁ¦ÀûÀ¸·Î Ãß°¡µÈ ÄÚµå´Â ¸ðµÎ ³× ±ºµ¥ÀÌ´Ù. »ó¼ö ·¹Áö½ºÅ͸¦ ÅëÇÏ¿© Àü´ÞÇϸé, ÀԷ·¹Áö½ºÅÍÀÇ ¹öÅؽº¿Í
Á¶ÇÕÇÏ¿© Ãâ·Â·¹Áö½ºÅÍ·Î ³» º¸³»´Â ±¸Á¶¶ó´Â°É ¸í½ÉÇÏÀÚ.

´ÙÀÌ·ºÆ® X 9.x¿¡¼­´Â ¼ÎÀÌ´õ »ç¿ë¹ýÀÌ ¾à°£ ¹Ù²î¾ú´Ù.

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