¹öÅؽº ¼ÎÀÌ´õ
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) ¼ÎÀÌ´õ ÄÚµå ¼³¸í
¼ÎÀÌ´õ ¹öÀüÀ» ¼³Á¤ÇÑ´Ù.
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 ¦¥
µðÇ»Áî »ö»óÀ» Ãâ·ÂÇÑ´Ù.
½ÇÁ¦ÀûÀ¸·Î Ãß°¡µÈ ÄÚµå´Â ¸ðµÎ ³× ±ºµ¥ÀÌ´Ù. »ó¼ö ·¹Áö½ºÅ͸¦ ÅëÇÏ¿©
Àü´ÞÇϸé, ÀԷ·¹Áö½ºÅÍÀÇ ¹öÅؽº¿Í Á¶ÇÕÇÏ¿© Ãâ·Â·¹Áö½ºÅÍ·Î ³»
º¸³»´Â ±¸Á¶¶ó´Â°É ¸í½ÉÇÏÀÚ.
´ÙÀÌ·ºÆ® X 9.x¿¡¼´Â ¼ÎÀÌ´õ »ç¿ë¹ýÀÌ ¾à°£ ¹Ù²î¾ú´Ù.
[Æß]
DirectX ½Ç½Ã°£ ·»´õ¸µ ½ÇÀü Å×Å©´Ð - Á¤º¸ ¹®È»ç
http://www.t-pot.com
|