DirectX9中的occlusion query

用代码来看远比看任何概念都快


1、首先是场景中的物体都选择包围盒,做一次正常的渲染,为不影响back buffer,可以开一个surface;

2、而后对每个物体的包围盒,在使用D3D Query的情况下,再次做渲染。每个物体渲染后我们可以从Query中得到这个物体有多少pixel能被最终渲染。这样就知道该物体是否真的需要被渲染;


DirectX 9的Query相关代码我放在代码的方法前面,仅做参考:


LPDIRECT3DQUERY9 d3dQuery;

// 初始化Query
d3dDevice->CreateQuery( D3DQUERYTYPE_OCCLUSION, &d3dQuery );

// 指示开始Query
d3dQuery->Issue( D3DISSUE_BEGIN );

// 指示结束Query
d3dQuery->Issue( D3DISSUE_END );

// 从Query中得到数据
d3dQuery->GetData((void *) &pixelsVisible, sizeof(DWORD), D3DGETDATA_FLUSH);



//-------------------------------------------------------------------------

HRESULT OcclusionCull()
{
	// Begin occlusionRender
	if( SUCCEEDED( occlusionRender->BeginScene( occlusionSurface, NULL ) ) )
	{
		// Clear the occlusionRender's surface
		d3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 200, 200, 200 ), 1.0f, 0);	

		// First, render every object's bounding box
		for( int i = 0; i < objects.size(); i++ )
		{
			objects[i].boundingMesh->Render( d3dDevice, objects[i].matTranslate );
		}

		// Now, render each box again, except this time, count how many pixels are visible
		// by using an occlusion query.  We are guaranteed to get the right amount, 
		// since all the bounding boxes have already been rendered

		for( int i = 0; i < objects.size(); i++ )
		{
			// Start the query
			d3dQuery->Issue( D3DISSUE_BEGIN );

			// Render
			objects[i].boundingMesh->Render( d3dDevice, objects[i].matTranslate );

			// End the query, get the data
			d3dQuery->Issue( D3DISSUE_END );

			// Loop until the data becomes available
			DWORD pixelsVisible = 0;
			while (d3dQuery->GetData((void *) &pixelsVisible, sizeof(DWORD), D3DGETDATA_FLUSH) == S_FALSE);
			
			if( pixelsVisible == 0 )
				objects[i].render = false;	// No pixels visible, do not render
			else
				objects[i].render = true;	// Pixels visible, render
			
		}

		// End the occlusion render scene
		occlusionRender->EndScene( 0 );

	}

	return S_OK;
}



你可能感兴趣的:(object,null,query,buffer,each)