Çȼ¿ ¼ÎÀÌ´õ

DirextX 8.0ÀÇ tutorial12¿¡ Çȼ¿ ¼ÎÀÌ´õ¸¦ Ãß°¡ÇÏ°Ú´Ù. Ä®¶ó·Î ³ª¿À´ø È­¸éÀ» Èæ¹éÀ¸·Î º¸¿©ÁÖ°Ô µÈ´Ù.

 

ÀÔ·Â º¤ÅÍ ·¹Áö½ºÅÍ:
µ¥ÀÌÅÍ°¡ µé¾î¿À´Â ·¹Áö½ºÅÍ·Î º¸°£µÈ Á¤Á¡ »öÀÌ µé¾î¿À´Â ¹öÆÛ·Î v0, v1ÀÌ ÀÖ´Ù.(Á¤Á¡ ¼ÎÀÌ´õÀÇ oD0, oD1¿¡¼­ ¿Â Ãâ·ÂÀÌ Çȼ¿ ¼ÎÀÌ´õÀÇ ÀÔ·ÂÀ¸·Î µé¾î¿Â´Ù)
º¸°£µÈ ÅؽºÃÄ ÁÂÇ¥°¡ µé¾î¿À´Â t0, t1, t2, t3°¡ ÀÖ´Ù.(Á¤Á¡ ¼ÎÀÌ´õÀÇ oT0, oT1...Ãâ·Â¿¡¼­ ÀÔ·ÂÀ¸·Î µé¾î¿Â´Ù)

»ó¼ö ·¹Áö½ºÅÍ:
c0 ~ c7±îÁö ÀÖ´Ù.

Àӽà ·¹Áö½ºÅÍ:
r0, r1 Àӽà ·¹Áö½ºÅÍ·Î Ãâ·Â ·¹Áö½ºÅͷεµ »ç¿ëµÈ´Ù.

Çȼ¿ ¼ÎÀÌ´õ ¿ª½Ã Á¤Á¡ ¼ÎÀÌ´õ¿Í È帧Àº Å©°Ô ´Ù¸£Áö ¾Ê´Ù
ÀԷ·¹Áö½ºÅÍÀÇ °ªÀ» »ó¼ö·¹Áö½ºÅÍÀÇ °ªÀ¸·Î ¿¬»êÇÑ µÚ¿¡ Ãâ·Â·¹Áö½ºÅÍ·Î º¸³»ÁØ´Ù´Â°É ±â¾ïÇÏ¸é µÈ´Ù

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

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

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

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

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

HRESULT CreateShader()
{
	const char szPixelShader[] =
	"ps.1.1							        \n"
	//"def c2, 0.3333f, 0.59f, 0.11f, 0.0f  \n"
	"tex t0									\n"
	"dp3 r0, t0, c2							\n";
 
	ID3DXBuffer* pShaderBuffer;
	ID3DXBuffer* pShaderErrors;
	if (FAILED(D3DXAssembleShader(szPixelShader, sizeof(szPixelShader) - 1,
	                                            0, NULL, &pShaderBuffer, &pShaderErrors)))
		return E_FAIL;

	if (FAILED(g_pd3dDevice->CreatePixelShader((DWORD *)pShaderBuffer->
	                                            GetBufferPointer(), &g_hPShader)))
		return E_FAIL;
	_RELEASE_(pShaderBuffer);
	return S_OK;
}	
	    

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

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

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

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

3) ·»µå¸µ

HRESULT Render3D ()
{
	HRESULT hr;

	D3DXMATRIX	matTranslation;

	// Clear the scene
	g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
		                                D3DCOLOR_XRGB(150,150,255), 1.0f, 0 );
	g_pd3dDevice->BeginScene();

	D3DXMatrixIdentity( &matTranslation );
	g_pd3dDevice->SetTransform(D3DTS_WORLD, &matTranslation);
	
	//Set texture
	g_pd3dDevice->SetTexture( 0, g_pTexture );

	g_pd3dDevice->SetStreamSource(0, g_pVertexBuffer, sizeof(MYVERTEX));
	g_pd3dDevice->SetVertexShader(D3DFVF_MYVERTEX);

	float fColorConstant[][4] = 
	{
        { 0.3333f, 0.59f, 0.11f, 0.0f}
    };
    g_pd3dDevice->SetPixelShaderConstant( 2, (VOID*)fColorConstant ,1); 
	g_pd3dDevice->SetPixelShader(g_hPShader);

	g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

    //Clear texture
	g_pd3dDevice->SetTexture( 0, NULL );
	
	g_pd3dDevice->EndScene();
	hr = g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

	return hr;
}

ÅؽºÃÄÀÇ Çȼ¿°ú Á¶ÇÕµÉ Ä®¶ó°ªÀ» c0¿¡ º¤ÅÍ°ªÀ¸·Î ³Ñ°ÜÁØ´Ù.
c0 ·¹Áö½ºÅÍ Çϳª¸¸ »ç¿ëµÇ±â ¶§¹®¿¡ 3¹ø° ÆĶó¸ÞÅÍ´Â 1ÀÌ´Ù.
g_pd3Device->SetPixelShaderConstant(0, (VOID)fColorConstant, 1);

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

4) ¼Ò¸ê

	if(g_hPShader)
	{
		g_pd3dDevice->DeletePixelShader(g_hPShader);
		g_hPShader = NULL;
	}

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

ps.1.1

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

tex  t0
dp3  r0, t0, c2

t0 ·¹Áö½ºÅÍ·Î ÅؽºÃĸ¦ ·ÎµùÇÑ´Ù.
Ãâ·Â ·¹Áö½ºÅÍ r0¿¡ ·ÎµùÇÑ ÅؽºÃÄ¿Í Ä®¶ó »ó¼ö c2ÀÇ ³»ÀûÀ¸·Î ´ÜÀ§°öÇѰ͵éÀ» ³Ö´Â´Ù.

±×·³... À¯¿ì³ªÀÇ ÀÌ»Û ¾ó±¼ÀÌ Èæ¹éÀ¸·Î Ãâ·ÂµÈ´Ù.

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

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