Попробовал occlusion query. Результат порадовал, если свет(70 источников) загорожен стенкой, то фпс 130. Если эти же источники распределить в лабиринте ( чтоб все сразу не было видно ) то фпс в среднем 90, без оклюжена фпс 58. Я щитаю это вин.
upd. Проверил в игре, фпс не опускается ниже 100
Но без косяков никуда. Бывает такой момент, что сферка пролезает сквозь стену и соответственно на экране нет ее фрагментов и свет пропадает, что с этим делать я не знаю.
Код оклюжена такой:
gpDevice->SetRenderState( D3DRS_STENCILENABLE, FALSE );
gpDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0x00000000 );
gpDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
for( auto pLight : g_pointLightList ) {
pLight->pQuery->Issue( D3DISSUE_BEGIN );
RenderSphere( pLight );
pLight->pQuery->Issue( D3DISSUE_END);
pLight->trulyVisible = false;
}
gpDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0xFFFFFFFF );
gpDevice->SetRenderState( D3DRS_STENCILENABLE, TRUE );
int count = g_pointLightList.size(), readyCount = 0;
do {
for( auto pLight : g_pointLightList ) {
DWORD pixelsVisible;
if( !pLight->trulyVisible ) {
if( pLight->pQuery->GetData( &pixelsVisible, sizeof( pixelsVisible ), D3DGETDATA_FLUSH ) == S_OK ) {
readyCount++;
if( pixelsVisible > 0 ) {
pLight->trulyVisible = true;
}
}
}
}
} while( readyCount < count );
Для каждого света свой IDirect3DQuery9
ты левел собираешь из каких-то модулей (типа кусок пещеры прямой, кусок с поворотом) или просто полигоны тянешь?
|
просто полигоны