寫(xiě)代碼這么久,材質(zhì)、渲染狀態(tài)和shader的問(wèn)題一直給我有很大的困攏,今天為了整理一下思路,決定寫(xiě)一下設(shè)計(jì)文檔和序列圖。經(jīng)過(guò)這樣一寫(xiě),和對(duì)之前渲染狀態(tài)管理的一些文章的理解,思路終于清楚了一點(diǎn)。
原來(lái)我是把材質(zhì)使用及shader的調(diào)用都寫(xiě)在一起,這樣寫(xiě)很不好。因?yàn)殇秩緺顟B(tài)與shader是應(yīng)該分組,然后在某一組中只調(diào)用一次,而材質(zhì)的使用(一般是紋理的使用),是每個(gè)renderobject都在渲染前都要設(shè)置的。
我覺(jué)得比較合理的做法是:把渲染狀態(tài)與shader封裝在一起,我這里統(tǒng)稱(chēng)shader,假如使用了effect,可以不做渲染狀態(tài)的封裝。然后,在渲染前要根據(jù)場(chǎng)景或整個(gè)游戲中用到的相同的shader進(jìn)行分組。然后把擁有這些shader的物體都放進(jìn)該shader的渲染隊(duì)列中去。在渲染過(guò)程中,首先遍歷所有組,在每組開(kāi)始時(shí),設(shè)置好渲染狀態(tài),包括shader的全局參數(shù)的設(shè)置,然后針對(duì)每個(gè)渲染物只做設(shè)置材質(zhì)的操作(這里的操作是:設(shè)置紋理、設(shè)置shader需要從renderObject中取得的參數(shù))。
排序流程:首先根據(jù)shader分組,把相同分組的渲染物放到同一個(gè)隊(duì)列, 然后,在同一個(gè)隊(duì)列中,把相同材質(zhì)的放在一起,這樣就可以減少紋理的切換。呵呵,今天先寫(xiě)這么多,接下來(lái)要好好設(shè)計(jì)一下。