在渲染不同的材质中,我们往往需要设置不同的状态。其中一种办法是在每一个FX文件中最后添加一个PASS,把状态设置回原来的默认值。另一个方法就是本次例子所用到的,使用ID3DXEffectStateManager。
OnRenderState内调用SortRenderables对可渲染对象进行排序。
void SortRenderables()
{
if( g_bSortOrderDirty )
{
// Each queue is sorted by material (effect) or instance
for( vector <pass>::iterator it = g_passes.begin();
it != g_passes.end();
it++ )
{
sort( ( *it ).begin(),
( *it ).end(),
g_bSortByMaterial ? greaterMaterial : greaterInstance );
}
}
g_bSortOrderDirty = false;
}
然后然我们看看greaterMaterial和greaterInstance。
inline bool greaterMaterial( CRenderable& lhs, CRenderable& rhs )
{
// sort by effect, which can be costly to switch
if( rhs.getEffect() > lhs.getEffect() )
return true;
else if( rhs.getEffect() < lhs.getEffect() )
return false;
// enforce the sorting by effect instance, lastly
// changing parameter values within an effect is likely to be less costly than switching effects.
return rhs.getEffectInstance() > lhs.getEffectInstance();
}
greaterInstance也差不多。
回到渲染函数。渲染函数中,按pass进行渲染。代码过长,详情看源码。
pEffect->getPointer()->Begin( &nPasses, D3DXFX_DONOTSAVESTATE );
DONOTSAVESTATE使得每一次渲染状态都需要重设。
这一次代码实在看得不太懂了,只好就此作罢。