µåµð¾î HLSLÀÌ´Ù. shader8.0 1, 2Àå shader9.0 1, 2ÀåÀ» º¸°í ¿À¸é
µµ¿òÀÌ µÉ°ÍÀÌ´Ù. 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 ¼³¸íÀº ¸¶Áö¸·¿¡ ÇÏ°Ú´Ù. 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 VS_OUTPUT VertexShader_main( float3 pos
: POSITION, float4 diff : COLOR0) Out.pos
= mul(float4(pos, 1), worldViewProj); return
Out; SetMatrix()¿¡¼ ³Ñ±ä »ó¼ö¸¦ Àü´Þ¹Þ´Â´Ù. ÀüÄ¡·Î
¹Ù²Ü ÇÊ¿ä°¡ ¾ø´Ù. [Æß] Microsoft DirectX 9 Programmable Graphics Pipeline - Á¤º¸¹®È»ç DirectX ½Ç½Ã°£ ·»´õ¸µ ½ÇÀü Å×Å©´Ð - Á¤º¸ ¹®È»ç http://www.t-pot.com |