Contents:
- 1 °³¿ä
- 2 °ü·Ã¼Àû
- 3 Áֿ丵ũ
- 4 D3DQuery ÇÁ·Î±×·¡¹Ö
- 4.1 D3DQuery º¯¼ö ¼±¾ð
- 4.2 D3DQuery ÃʱâÈ
- 4.3 D3DQuery Occlusion ó¸®
- 4.4 D3DQuery ÇØÁ¦
- 5 ÀÀ¿ë
- 6 ´Ù¿î·Îµå
- 7 °ü·Ã¸µÅ©
DirectX 9.0 ºÎÅÍ Çϵå¿þ¾î °¡¼ÓÀ» ÀÌ¿ëÇÑ Occlusion Culling ÀÌ °¡´ÉÇÏ´Ù. IDirect3DQuery9 ÀÎÅÍÆäÀ̽ºÀÇ D3DQUERYTYPE_OCCLUSION Query ¿¡ ÀÇÇÏ¿© ó¸®ÇÑ´Ù.
D3DQuery ÀÇ D3DQUERYTYPE_OCCLUSION Query ´Â ·»´õ¸µµÈ Pixel ¼ö¸¦ ±¸ÇÏ´Â Query ·Î Mesh ¸¦ ½ÇÁ¦·Î ·»´õ¸µÇϱâ Àü¿¡ Àüó¸® °úÁ¤À̶ó°í º¼ ¼ö ÀÖ´Ù.
4.1 D3DQuery º¯¼ö ¼±¾ð #
1 LPDIRECT3DQUERY9 m_pTeapotVizQuery;
2
3 BOOL m_bDeviceSupportsVizQuery; // D3DQuery Áö¿ø ¿©ºÎ
4 DWORD m_dwVizData; // ·»´õ¸µµÈ Pixel ¼ö
4.2 D3DQuery ÃʱâÈ #
1 // D3DQUERYTYPE_OCCLUSION Áö¿ø ¿©ºÎ È®ÀÎ
2 if( D3DERR_NOTAVAILABLE == m_pd3dDevice->CreateQuery(
3 D3DQUERYTYPE_OCCLUSION, NULL ) )
4 {
5 m_bDeviceSupportsVizQuery = FALSE; // Áö¿ø ¾ÈµÊ
6 }
7 else
8 {
9 m_bDeviceSupportsVizQuery = TRUE; // Áö¿ø µÊ
10 }
11
12 // D3DQuery »ý¼º
13 if( m_bDeviceSupportsVizQuery )
14 {
15 m_pd3dDevice->CreateQuery( D3DQUERYTYPE_OCCLUSION,
16 &m_pTeapotVizQuery );
17 }
4.3 D3DQuery Occlusion ó¸® #
1 //
2 // Áö¿øµÉ °æ¿ì Query ½ÃÀÛ
3 //
4 if( m_bDeviceSupportsVizQuery )
5 {
6 m_pTeapotVizQuery->Issue( D3DISSUE_BEGIN );
7 }
8
9 //
10 // teapot ¸¦ ±×¸°´Ù.
11 //
12 LPDIRECT3DVERTEXBUFFER9 pVB;
13 LPDIRECT3DINDEXBUFFER9 pIB;
14 UINT numVertices, numFaces;
15
16 m_pTeapot->m_pLocalMesh->GetVertexBuffer( &pVB );
17 m_pTeapot->m_pLocalMesh->GetIndexBuffer( &pIB );
18 numVertices = m_pTeapot->m_pLocalMesh->GetNumVertices();
19 numFaces = m_pTeapot->m_pLocalMesh->GetNumFaces();
20
21 m_pd3dDevice->SetFVF( m_pTeapot->m_pLocalMesh->GetFVF() );
22
23 m_pd3dDevice->SetStreamSource( 0, pVB, 0, sizeof( TEAPOT_VERTEX ) );
24 m_pd3dDevice->SetIndices( pIB );
25
26 m_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,
27 0, 0, numVertices, 0, numFaces );
28
29 SAFE_RELEASE( pVB );
30 SAFE_RELEASE( pIB );
31
32
33 // Áö¿øµÉ °æ¿ì Query ¸¦ Á¾·áÇÏ°í °á°ú°ª¸¦ ±â´Ù¸°´Ù.
34 if( m_bDeviceSupportsVizQuery )
35 {
36 m_pTeapotVizQuery->Issue(D3DISSUE_END );
37
38 // Stupidly block until we have a query result
39 while( m_pTeapotVizQuery->GetData( (void *) &m_dwVizData,
40 sizeof( DWORD ), D3DGETDATA_FLUSH ) == S_FALSE )
41 {
42 // asynchronous aspect of GetData() so I can do something
43 // here while the HW is still working on my DrawPrimitives()
44 }
45 }
4.4 D3DQuery ÇØÁ¦ #
1 if( m_bDeviceSupportsVizQuery )
2 {
3 SAFE_RELEASE( m_pTeapotVizQuery );
4 }
5 ÀÀ¿ë #
D3DQUERYTYPE_OCCLUSION Query ´Â ½ÇÁ¦·Î ·»´õ¸µµÇ´Â 2Â÷ ·»´õ¸µ Àü¿¡ Z-Buffer ¸¦ ÀÌ¿ëÇÑ 1Â÷ ·»´õ¸µ½Ã Occlusion ¿©ºÎ¸¦ È®ÀÎÇØ¾ß ÇÑ´Ù.
- Á¤¹ÐÇÑ Occlusion detection À» À§Çؼ´Â ½ÇÁ¦ ȸé°ú µ¿ÀÏÇÑ Å©±âÀÇ Z-Buffer ¸¦ »ý¼ºÇÏ¿© Test ÇÑ´Ù.
- °£´ÜÇÑ Test °¡ ÇÊ¿äÇÑ °æ¿ì ȸ麸´Ù ÀÛÀº Z-Buffer ¸¦ ÀÌ¿ëÇÏ¿© Á¤¹Ðµµ´Â ¶³¾îÁöÁö¸¸ Occlusion Test ¼Óµµ¸¦ ³ôÀÏ ¼ö ÀÖ´Ù.
6 ´Ù¿î·Îµå #