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

´ÙÀÌ·ºÆ® 9.0À¸·Î ¿À¸é¼­ 8.0°ú »ç¿ë¹ýÀÌ ´Ù¸£´Ù.
³»°¡ »ç¿ëÇÑ ¹öÀüÀº 9.0C ¹öÀüÀ¸·Î ÄÄÆÄÀÏÇÑ ¹öÀüÀ¸·Î Shader8.0ÀÇ tutorial01°ú ºñ±³Çغ¸ÀÚ.
ÁÖȲ»öÀ¸·Î ÀÖ´Â°Ô 9.0C ¹öÀüÀÌ°í À§¿¡ ÀÖ´Â Äڵ尡 8.0 ¹öÀüÀÌ´Ù.

´ÙÀÌ·ºÆ® X °íÁ¤ÆÄÀÌÇÁ ºÎºÐÀ» ºñ±³ÇÑÈÄ ¼ÎÀÌ´õÀÇ ´Ù¸¥Á¡À» ¾Ë¾Æº¸ÀÚ.

1. Çì´õÆÄÀÏ°ú ¶óÀ̺귯¸® ±³Ã¼

#include <d3d8.h>
#include <d3dx8.h>
#pragma comment (lib, "dxguid.lib")
#pragma comment (lib, "d3d8.lib")
#pragma comment (lib, "d3dx8.lib") 

#include <d3d9.h>
#include <d3dx9.h>
#pragma comment (lib, "dxguid.lib")
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")

Çì´õÆÄÀÏ°ú ¶óÀ̺귯¸®¸¦ 9·Î ±³Ã¼ÇÑ´Ù.


2. ÀÎÅÍÆäÀ̽º ±³Ã¼

LPDIRECT3D8                            g_d3d        = NULL; // our main d3d8 interface
LPDIRECT3DDEVICE8                  g_d3d_Device = NULL; // our d3d8 device
LPDIRECT3DVERTEXBUFFER8      g_VertexBuffer = NULL; // our VertexBuffer
D3DPRESENT_PARAMETERS       g_d3dpp;

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

LPDIRECT3D9                                 g_d3d        = NULL; // our main d3d8 interface
LPDIRECT3DDEVICE9                       g_d3d_Device = NULL; // our d3d8 device
LPDIRECT3DVERTEXBUFFER9           g_VertexBuffer = NULL; // our VertexBuffer
D3DPRESENT_PARAMETERS            g_d3dpp;

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

´ÙÀÌ·ºÆ® X  ÀÎÅÍÆäÀ̽º, µð¹ÙÀ̽º, ¹öÅؽº ¹öÆÛ°¡ 9·Î ¹Ù²î¾ú°í, ¹öÅؽº ¼ÎÀÌ´õÀÇ ÇÚµéÀ» 8.0¿¡¼­´Â DWORD·Î »ç¿ë ÇßÀ¸³ª 9.0¿¡¼­´Â ¼ÎÀÌ´õ ¼±¾ð LPDIRECT3DVERTEXSHADER9¸¦ »ç¿ëÇÏ¿© ¹öÅؽº ¼ÎÀÌ´õÀÇ ÇÚµéÀ» ¼±¾ðÇÑ´Ù.

¹öÅؽº ¼ÎÀÌ´õ¿ë º¯¼ö°¡ Çϳª ´õ Ãß°¡µÇ¾ú´Ù.
g_pVertexDeclaration ¼ÎÀÌ´õ ¼±¾ðÇÚµéÀÌ Çϳª ´õ ÇÊ¿äÇÏ´Ù. 8¿¡¼­´Â CreateVertexShader()¿¡¼­ ¹öÅؽº ¼±¾ð ¹è¿­À» ³Ñ°ÜÁÖÁö¸¸ 9¿¡¼­´Â SetVertexDeclaration(g_pVertexDeclaration) ó·³ ¹öÅؽº ¼±¾ðÇÚµéÀ» ³Ñ°ÜÁØ´Ù. µÚ¿¡ °¡¸é ³ª¿Ã °ÍÀÌ´Ù.


3. ´ÙÀÌ·ºÆ® X ÀÎÅÍÆäÀ̽º »ý¼º

if( NULL == ( g_d3d = Direct3DCreate8( D3D_SDK_VERSION ) ) )

if( NULL == ( g_d3d = Direct3DCreate9( D3D_SDK_VERSION ) ) )


4. D3DPRESENT ±¸Á¶Ã¼ ±³Ã¼

g_d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE;

g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;


5. CreateVertexBuffer º¯È­

g_d3d_Device->CreateVertexBuffer(7*sizeof(CUSTOMVERTEX),   
                          0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer)

g_d3d_Device->CreateVertexBuffer(7*sizeof(CUSTOMVERTEX),
                          0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer, NULL)

¸¶Áö¸· ÀÎÀÚ pSharedhandleÀÌ Ãß°¡ µÇ¾ú´Âµ¥, ÀÌ¿ëµÇÁö ¾ÊÀ¸¸ç NULL·Î ä¿î´Ù.


6. SetStreamSource, SetVertexShader º¯È­

        g_d3d_Device->SetStreamSource( 0,  g_VertexBuffer, sizeof(CUSTOMVERTEX) );
        g_d3d_Device->SetVertexShader( D3DFVF_CUSTOMVERTEX );

        g_d3d_Device->SetStreamSource( 0,  g_VertexBuffer, 0, sizeof(CUSTOMVERTEX) );
        g_d3d_Device->SetFVF( D3DFVF_CUSTOMVERTEX );

SetStreamSource()µµ ¹Ù²î¾ú´Ù. 9.0¹öÀü¿¡ ¼¼ ¹ø° ÆĶó¸ÞÅÍ°¡ Ãß°¡ µÇ¾ú´Ù. ¹¹ÇÏ´ÂÁö´Â 9.0¹®¼­°¡ ¾ø¾î¼­ ±×³É ³Ñ¾î°£´Ù.
8¿¡¼­ »ç¿ëÇÏ´ø SetVertexShader()´Â 9¿¡¼­´Â ¼ÎÀÌ´õ¸¦ ¼³Á¤ÇÒ ¶§¸¸ »ç¿ëµÈ´Ù.
9¿¡¼­ °íÁ¤ÆÄÀÌÇÁ¶óÀÎÀÇ ¹öÅؽº ŸÀÔÀº ¾î¶»°Ô ¼ÂÆÃÇϳĸé SetFVF¸¦ »ç¿ëÇÑ´Ù.

 

ÇÏÇÏÇÏ ~~~ ¾ðÁ¦ ³¡³ª!

 ÀÌÁ¦ ¼ÎÀÌ´õ ¼³¸íÀ¸·Î ³Ñ¾î °¥·Ã´Ù. Áö°Ü¿ö¼­ ³Ñ¾î°¥·Ã´Ù..ÈÖ¸®¸¯ ~~~

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

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

9.0 ¹öÅؽº ¼ÎÀÌ´õ¿¡¼­´Â LPDIRECT3DVERTEXDECLARATION9 ¼±¾ðÀ» ¼ÎÀÌ´õ ÇÚµé°ú ÇÔ²² Àü¿ªº¯¼ö¸¦ ¸¸µç´Ù.
ÀÌÀ¯´Â ¼ÎÀÌ´õ »ý¼º¿¡¼­ ¾Ë¾Æ º»´Ù.

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

HRESULT CreateShader()
{
	const char szVertextShader[] =
	"vs.1.1                \n"
	"dcl_position v0       \n"
	"dcl_color   v5        \n"
	"dp4 oPos.x, v0, c0    \n"
	"dp4 oPos.y, v0, c1    \n"
	"dp4 oPos.z, v0, c2    \n"
	"dp4 oPos.w, v0, c3    \n"
	"mov oD0,  v5          \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(D3DXAssembleShader(szVertextShader, sizeof(szVertextShader) - 1, 0, NULL, 
					DXSHADER_DEBUG, &pShaderBuffer, &pShaderErrors)))
		return E_FAIL;

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

 9.0 ¹öÅؽº ¼ÎÀÌ´õ¿¡´Â ¾Æ·¡ÀÇ 2°¡Áö ¸í·ÉÀ¸·Î ÀÔ·Â ·¹Áö½ºÆ®¸¦ ¼±¾ðÇÑ´Ù.

dcl_position v0
dcl_color   v5  

8.0 ¹öÅؽº ¼ÎÀÌ´õ¿¡¼­´Â Á¤ÇØÁø ÀԷ°ªÀ» µðÆúÆ®·Î »ç¿ëÇßÁö¸¸, 9.0¿¡¼­´Â ¼±¾ðÇÏ¿© »ç¿ëÇÑ´Ù.(È®½ÇÇÑÁö ¾Æ´ÑÁö À߸ð¸§).

¹öÅؽº ¼±¾ðµµ ¾à°£ ¹Ù²î¾ú´Ù. DeclarationÀ» º¸ÀÚ.

0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0

0 : ½ºÆ®¸² ¹øÈ£ 0 ÀÌ ¿¹Á¦´Â ´ÜÀÏ ½ºÆ®¸²ÀÌ´Ù.

0 : ¹öÅؽºÀÇ ½ÃÀÛÁ¡ ¿ÀÇÁ¼Â ÁöÁ¤. ¹ÙÀÌÆ® ´ÜÀ§·Î Çϴµ¥, Diffuse Color°¡ ³ª¿Ã ¶§´Â 12¹ÙÀÌÆ®ºÎÅÍ ½ÃÀÛÀÌ´Ù.

D3DDECLTYPE_FLOAT3  : µ¥ÀÌÅÍ Å¸ÀÔ ÁöÁ¤. ÀÌ »ó¼ö´Â 3°³ÀÇ ºÎµ¿¼Ò¼öÁ¡(x, y, z)À» ÀǹÌÇÑ´Ù.

D3DDECLMETHOD_DEFAULT : Å×¼¿·¹ÀÌ¼Ç ¸í·É. ±âº»°ªÀº Å×¼¿·¹À̼ǾøÀÌ µ¥ÀÌÅÍ°¡ ÆÄÀÌÇÁ¶óÀÎÀ» Åë°úÇÑ´Ù.

D3DDECLUSAGE_POSITION : µ¥ÀÌÅÍÀÇ »ç¿ëµÇ´Â ¿ëµµ·Î ¿©±â¼­´Â À§Ä¡ µ¥ÀÌÅ͸¦ ÀǹÌÇÑ´Ù.

0 : ¿ë¹ý À妽º. D3DDECLUSAGE_TEXCOORD0, D3DDECLUSAGE_TEXCOORD1 µî°ú °°Àº À¯»çÇÑ µ¥ÀÌÅÍ ¼ººÐÀ» »ç¿ëÇÏ´Â ¹öÅؽº ¹öÆÛ¿¡¼­ ¼ººÐÀ» ½Äº°ÇÑ´Ù. °¢ ¿ë¹ý À妽º Á¶ÇÕÀº ½Ã¸àƽ(semantic)À¸·Î ºÒ¸°´Ù. ½Ã¸àƽÀº ¹öÅؽº ¹öÆÛ  ¼ººÐÀ» ¹öÅؽº ¼ÎÀÌ´õ ·¹Áö½ºÅÍ¿¡ ¸µÅ©ÇÑ´Ù.

¸¶Áö¸· ÁÙÀº D3DDECL_END()¸ÅÅ©·ÎÀÌ´Ù.

CreateVertexDeclaration( Declaration, &g_pVertexDeclaration )

8.0¿¡¼­´Â ¹öÅؽº ¼±¾ðÀÚ¸¦ CreateVertexShader()½Ã¿¡ Àü´ÞÇßÁö¸¸ 9.0¿¡¼­´Â SetVertexDeclaration()½ÇÇà½Ã¿¡ ¼³Á¤ÇÑ´Ù.

D3DXAssembleShader()¿¡¼­´Â DXSHADER_DEBUG°¡ Ãß°¡ µÇ¾ú´Ù.

CreateVertexShader((DWORD *)pShaderBuffer->GetBufferPointer(), &g_hVShader)

¾Õ¿¡¼­µµ ¼³¸íÇß´Ù½ÃÅ° ¹öÅؽº ¼±¾ðÀÚ ¼ÂÆÃÀÌ º°µµ·Î ºÐ¸® µÇ¾ú´Ù.

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->SetVertexShaderConstantF(0, (float*)&ShaderMatrix, 4);
	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);
#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 );

g_d3d_Device->SetVertexDeclaration( g_pVertexDeclaration) ¹öÅؽº ¼±¾ðÀÚ¸¦ º°µµ·Î ¼±¾ðÇÑ´Ù.

4) ¼Ò¸ê

	    
    _RELEASE_(g_hVShader);
    _RELEASE_(g_pVertexDeclaration);
DeleteVertexShader() °°Àº ¼ÎÀÌ´õ ¼Ò¸êÀÚ´Â ´õ ÀÌ»ó »ç¿ëÇÏÁö ¾Ê´Â´Ù.
¹öÅؽº ¼±¾ðÀÚµµ ¼Ò¸ê ½ÃÄÑ¾ß ÇÑ´Ù.
 
[Æß]
Microsoft DirectX 9 Programmable Graphics Pipeline - Á¤º¸¹®È­»ç
DirectX ½Ç½Ã°£ ·»´õ¸µ ½ÇÀü Å×Å©´Ð - Á¤º¸ ¹®È­»ç
http://www.t-pot.com