最近為了實(shí)現(xiàn)多光源和多陰影的渲染,把渲染系統(tǒng)改成了多Pass的,對(duì)每一個(gè)可見光源進(jìn)行一次光照、ShadowMap和最終陰影的渲染,雖然這樣等于是把整個(gè)場景重復(fù)渲染了很多次,但為了實(shí)現(xiàn)靈活的實(shí)時(shí)光照系統(tǒng),這似乎是唯一的辦法了。 但實(shí)踐后發(fā)現(xiàn),陰影和光照會(huì)隨著骨骼動(dòng)畫的播放而閃爍,甚至鏡頭的移動(dòng)也會(huì)造成閃爍,究其原因,還是邏輯線程和渲染線程的同步問題,由于對(duì)場景內(nèi)的同一個(gè)物體渲染了多次,而邏輯線程又在不停的更新攝像機(jī)和骨骼動(dòng)畫數(shù)據(jù),導(dǎo)致了兩Pass渲染取到的數(shù)據(jù)很可能不一致,造成了光照和陰影的閃爍。 所以共享數(shù)據(jù)結(jié)構(gòu)必須做一些修改,在多Pass渲染開始前進(jìn)行一次備份,渲染中只取備份數(shù)據(jù),這樣就保證了多次渲染的數(shù)據(jù)一致性了
也就是加這么兩個(gè)簡單的set和get方法,在渲染相關(guān)數(shù)據(jù)讀取時(shí)調(diào)用get,邏輯相關(guān)時(shí)調(diào)用read
|