好久沒更新了。。上自己博客看了下這篇2個(gè)月前的草稿都還沒寫完。。的確是要荒廢了快。。囧
最近上班沒什么事情,所以便考慮著把自己老土的d9圖形山寨引擎移植到d10上(其實(shí)可以直接移植到d11的)。。我就慢半拍吧。。首先d10,11和d9的一大區(qū)別就是本來d9眾多的setState被去除,而使用改進(jìn)的state object,這些包括了Input-Layout State, Rasterizer State,Depth-Stencil State, Blend State, Sampler State。可以看到本來的多次set函數(shù)被大量簡化了,而這些state object都是依靠對應(yīng)的DESC(描述),來直接創(chuàng)建出來,用戶在使用的時(shí)候只需要向驅(qū)動(dòng)層傳遞一個(gè)句柄(也就是新的set函數(shù))既可以對許多個(gè)狀態(tài)進(jìn)行改變,例如Rasterizer State的DESC:
typedef struct D3D10_RASTERIZER_DESC {
D3D10_FILL_MODE FillMode;
D3D10_CULL_MODE CullMode;
BOOL FrontCounterClockwise;
INT DepthBias;
FLOAT DepthBiasClamp;
FLOAT SlopeScaledDepthBias;
BOOL DepthClipEnable;
BOOL ScissorEnable;
BOOL MultisampleEnable;
BOOL AntialiasedLineEnable;
} D3D10_RASTERIZER_DESC;
可以看到一次set可以一次給驅(qū)動(dòng)發(fā)送以前d9曾經(jīng)需要很多條command的工作,可想而知其帶來的性能提升。
但這也帶來了新的問題,由于這些state object的創(chuàng)建是比較耗時(shí)的,所以便不可能像以前d9一樣沒幀都去set,而且由于DESC里有多個(gè)配置項(xiàng),也無法簡單的去cache。看到這里,我想看過Christer和clayman大人那兩篇關(guān)于渲染排序文章的同學(xué)應(yīng)該能想到對應(yīng)的思路。那就是做一個(gè)sortkey,對于Rasterizer State來說,FillMode這些枚舉,bool都是能直接做入sortkey的(節(jié)省比較次數(shù)),剩下的譬如int或者float則直接比較,也就是重載operator==和!=
譬如
bool operator==(const D3D10RasterState& rhs)
{
if(SortKey == rhs.SortKey && DESC.DepthBias == rhs.DESC. DepthBias &&
fabs(DESC. DepthBiasClamp – rhs.DESC. DepthBiasClamp) < 0.000001f && etc..)
return true;
return false;
}
UE3中這塊大概也是這樣的,不過他沒有弄sortkey什么,他是很簡單直接重載了==和!=的用memcmp比較State的DESC就完了..簡單易用吧。。