两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種基于狀態(tài)集的Shader三維圖形繪制框架和繪制方法

文檔序號(hào):6651038閱讀:276來(lái)源:國(guó)知局
專利名稱:一種基于狀態(tài)集的Shader三維圖形繪制框架和繪制方法
技術(shù)領(lǐng)域
本發(fā)明涉及一種三維圖形引擎框架,特別是一種基于狀態(tài)集的Shader三維圖形繪制框架和繪制方法。
背景技術(shù)
隨著硬件設(shè)計(jì)和工藝水平的提高,圖形處理單元(Graphic ProcessingUnit,GPU)成為圖形實(shí)時(shí)渲染過(guò)程中的核心角色。利用GPU可以將CPU(中央處理器)的負(fù)載轉(zhuǎn)移,緩解CPU和AGP在圖形渲染過(guò)程中造成的數(shù)據(jù)傳輸瓶頸,同時(shí)增加的可編程特性,可以對(duì)輸入物體的形狀、外觀和運(yùn)動(dòng)提供可編程控制。
圖形處理單元提供了兩種可編程模塊,通過(guò)運(yùn)行特殊Shader程序完成渲染對(duì)象的逐頂點(diǎn)per-vertex以及逐片段per-pixel的并行運(yùn)算。這些在主程序中被指定并在運(yùn)行時(shí)由渲染管線自動(dòng)調(diào)用?;贕PU的繪制過(guò)程首先是程序輸入繪制物體的頂點(diǎn)、顏色和紋理等信息,這些數(shù)據(jù)將被頂點(diǎn)控制器程序VertexShader處理,其結(jié)果包含最新變換后的頂點(diǎn)進(jìn)而完成圖元裝配和光柵化。隨后,片段控制器程序Pixel Shader提供逐片斷的操作,其結(jié)果將被送入幀緩存顯示。這種繪制方式的高效率得益于其并行化的計(jì)算,這不僅能夠提高程序?qū)崟r(shí)渲染的速度,還拓展了實(shí)時(shí)渲染程序的特效內(nèi)容,如高動(dòng)態(tài)渲染、凹凸貼圖、柔和陰影等效果。
利用GPU進(jìn)行實(shí)時(shí)圖形渲染計(jì)算是近年來(lái)軍事仿真和電腦游戲也競(jìng)相選擇的編程方式。伴隨著GPU硬件的不斷更新,從早期的游戲極品飛車(chē)到最新的DOOM III,甚至于利用最先進(jìn)設(shè)備制作的數(shù)字電影,越來(lái)越多的逼真渲染實(shí)時(shí)計(jì)算使用了GPU這一利器。
雖然,對(duì)GPU執(zhí)行的Shader程序的管理整合到現(xiàn)有的圖形引擎有助于進(jìn)一步提高繪制效率、提高渲染逼真性,但隨之產(chǎn)生的負(fù)面影響是渲染環(huán)境狀態(tài)數(shù)量的增加和切換的頻繁。目前,對(duì)狀態(tài)的描述和管理一般采用狀態(tài)集的概念,以往有多種Shader整合方法,傳統(tǒng)采用最多的是回調(diào)函數(shù),如圖1所示。這種方式在渲染前提供接口聲明Shader程序?qū)ο蠛屠L制狀態(tài),沒(méi)有考慮到渲染對(duì)象之間在狀態(tài)上的關(guān)系,不能進(jìn)行狀態(tài)合并,從而限制了繪制效率。

發(fā)明內(nèi)容
本發(fā)明的技術(shù)解決問(wèn)題是克服現(xiàn)有技術(shù)的不足,提供一種基于狀態(tài)集的Shader圖形繪制框架和繪制方法,它對(duì)Vertex Shader和Pixel Shader進(jìn)行了有效管理,充分利用狀態(tài)集的狀態(tài)封裝和排序功能,在提高了繪制效率的同時(shí),簡(jiǎn)化了接口調(diào)用,方便了程序員的開(kāi)發(fā)。
本發(fā)明的技術(shù)解決方案一種基于狀態(tài)集的Shader三維圖形繪制框架,由繪制對(duì)象描述接口文件Materials Description、場(chǎng)景圖SceneGraph、渲染對(duì)象、繪制引擎Render Engine組成,其特征在于所述的Materials Description通過(guò)xml文件進(jìn)行定義,對(duì)繪制對(duì)象的模型信息、紋理信息、聲音信息、Shader文件或代碼內(nèi)容以及繪制所需狀態(tài)信息進(jìn)行統(tǒng)一封裝和描述;所述的場(chǎng)景圖的內(nèi)存存貯結(jié)構(gòu)分為材質(zhì)載入器Material Loader和介質(zhì)載入器Media Loader兩部分,Material Loader負(fù)責(zé)讀取對(duì)象整體描述及繪制狀態(tài)信息,同時(shí)對(duì)繪制狀態(tài)信息以Shader信息排序進(jìn)行靜態(tài)優(yōu)化,并調(diào)入渲染對(duì)象的狀態(tài)集中,Media Loader負(fù)責(zé)讀取頂點(diǎn)、紋理、音頻以及Shader代碼繪制對(duì)象本身的幾何信息,同時(shí)建立全局交叉數(shù)組并輔以索引數(shù)組,并調(diào)入渲染對(duì)象的數(shù)據(jù)集中;所述的渲染對(duì)象,分為狀態(tài)集和數(shù)據(jù)集,狀態(tài)集包括頂點(diǎn)描述VertexDescription和片段Pixel Description描述,在渲染過(guò)程中,狀態(tài)集對(duì)繪制狀態(tài)信息按照Shader信息繼續(xù)排序進(jìn)行動(dòng)態(tài)優(yōu)化,數(shù)據(jù)集對(duì)全局交叉數(shù)組和索引數(shù)組的進(jìn)行更新保存;
所述的繪制引擎由繪制控制和狀態(tài)控制構(gòu)成,繪制控制是對(duì)渲染對(duì)象進(jìn)行繪制過(guò)程中的控制,它根據(jù)渲染對(duì)象的數(shù)據(jù)集中幾何信息分發(fā)給OpenGL或硬件代碼進(jìn)行繪制;狀態(tài)控制,是對(duì)渲染對(duì)象進(jìn)行繪制過(guò)程中有關(guān)繪制狀態(tài)的控制,繪制控制和狀態(tài)控制兩者配合完成一個(gè)繪制對(duì)象的繪制過(guò)程。
所述的繪制狀態(tài)信息以Shader信息排序進(jìn)行靜態(tài)優(yōu)化繪制狀態(tài)的靜態(tài)優(yōu)化過(guò)程為(1)初始化全局交叉數(shù)組,數(shù)組結(jié)構(gòu)采用標(biāo)準(zhǔn)庫(kù)Array模版,每單元內(nèi)容為OpenGL的枚舉型T2_C4_N3_V3結(jié)構(gòu);(2)初始化全局索引數(shù)組,數(shù)組結(jié)構(gòu)采用標(biāo)準(zhǔn)庫(kù)Array模版,每單元內(nèi)容為長(zhǎng)整形結(jié)構(gòu);(3)當(dāng)有新的繪制對(duì)象加入場(chǎng)景圖后,分別完成如下操作a.獲得繪制對(duì)象的紋理、顏色、法向量、位置數(shù)組指針;b.進(jìn)行索引生成,保證每一個(gè)頂點(diǎn)在交叉數(shù)組中只出現(xiàn)一次;c.獲得繪制對(duì)象的繪制狀態(tài)指針,并根據(jù)指針獲得紋理以及Shader信息;d.在全局交叉數(shù)組中搜索與該繪制對(duì)象具有相同Shader的數(shù)組部分,若發(fā)現(xiàn)則繼續(xù)搜索與該繪制對(duì)象具有相同紋理狀態(tài)的數(shù)組部分,如發(fā)現(xiàn)則將該頂點(diǎn)序列和索引序列分別存儲(chǔ)在全局交叉數(shù)組和索引數(shù)組中,若沒(méi)有對(duì)應(yīng)紋理的數(shù)組,則將該頂點(diǎn)序列和索引序列存儲(chǔ)在該Shader對(duì)應(yīng)的最后一個(gè)數(shù)組序列之后;若沒(méi)有與相同的Shader,則將該頂點(diǎn)序列和索引序列存儲(chǔ)在全局的交叉數(shù)組和索引數(shù)組之后;(4)在繪制對(duì)象中記錄其索引在全局索引中的起始點(diǎn)和長(zhǎng)度,完成靜態(tài)優(yōu)化。
所述的繪制狀態(tài)信息以Shader信息排序進(jìn)行動(dòng)態(tài)優(yōu)化過(guò)程為(1)初始化繪制數(shù)組以便防止繪制對(duì)象序列;(2)依次獲得每一針的所需的繪制對(duì)象;(3)遍歷繪制數(shù)組搜索相應(yīng)Shader以及紋理信息的繪制狀態(tài)
a.若為搜索到相似的Shader,則將該對(duì)象放入繪制數(shù)組的末端;b.若發(fā)現(xiàn)相似的Shader而沒(méi)有相似的紋理,則將該對(duì)象放入該Shader對(duì)應(yīng)的數(shù)組的相對(duì)末端;(4)當(dāng)發(fā)現(xiàn)Shader和紋理均相似時(shí)開(kāi)始進(jìn)行動(dòng)態(tài)排序a.按照耗時(shí)優(yōu)先級(jí)比較最耗時(shí)的狀態(tài)的是否有與該對(duì)象相同的,如不相同則插入相同對(duì)象的之后;b.若相同則在相同的對(duì)象組中繼續(xù)比較下一個(gè)耗時(shí)狀態(tài),如此往復(fù),直到所有狀態(tài)比較結(jié)束;c.當(dāng)最后一個(gè)狀態(tài)比較仍像同,則視為兩個(gè)繪制對(duì)象完全相同,進(jìn)而順序排列即可;(5)處理下一個(gè)繪制對(duì)象,直到所有帶繪制對(duì)象處理比較完畢。
采用上述基于狀態(tài)集的Shader三維圖形繪制方法,包括下列步驟(1)將繪制對(duì)象的模型信息、紋理信息、聲音信息以及相應(yīng)的Shader代碼在被調(diào)入場(chǎng)景圖之前被統(tǒng)一封裝和描述在繪制對(duì)象的描述接口MaterialsDescription文件中;(2)將上述的繪制對(duì)象信息通過(guò)場(chǎng)景圖的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)中的MaterialLoader和Media Loader分別調(diào)入渲染對(duì)象中,其中Material Loader負(fù)責(zé)繪制對(duì)象的狀態(tài)信息調(diào)入,Material Loader在將狀態(tài)信息調(diào)入之前,要按照Shader信息排序進(jìn)行靜態(tài)優(yōu)化,并調(diào)入渲染對(duì)象的狀態(tài)集中;Media Loader負(fù)責(zé)讀取頂點(diǎn)、紋理、音頻以及Shader代碼繪制對(duì)象本身的幾何信息,同時(shí)建立全局交叉數(shù)組并輔以索引數(shù)組,并調(diào)入渲染對(duì)象的數(shù)據(jù)集中;(3)將渲染對(duì)象分為狀態(tài)集和數(shù)據(jù)集,狀態(tài)集包括頂點(diǎn)描述VertexDescription和片段Pixel Description描述,在渲染過(guò)程中,狀態(tài)集對(duì)繪制對(duì)象的狀態(tài)信息按照Shader信息繼續(xù)排序進(jìn)行動(dòng)態(tài)優(yōu)化,數(shù)據(jù)集對(duì)全局交叉數(shù)組和索引數(shù)組的更新進(jìn)行保存;
(4)將在渲染對(duì)象中渲染后的繪制對(duì)象送入繪制引擎進(jìn)行繪制,繪制引擎由繪制控制和狀態(tài)控制構(gòu)成,繪制控制將獲得的對(duì)象頂點(diǎn)、紋理、音頻以及Shader代碼的繪制對(duì)象本身數(shù)據(jù)信息分發(fā)給OpenGL或硬件代碼進(jìn)行繪制,而繪制對(duì)象的狀態(tài)描述信息則交由狀態(tài)控制進(jìn)行繪制狀態(tài)的改變,繪制控制和狀態(tài)控制兩者配合完成一個(gè)繪制對(duì)象的繪制過(guò)程。
本發(fā)明的原理是一個(gè)場(chǎng)景圖的生成過(guò)程依賴于模型文件和模型讀入器,經(jīng)過(guò)模型載入過(guò)程生成的場(chǎng)景圖數(shù)據(jù)結(jié)構(gòu)可能存在一些影響圖形繪制效率的地方。本發(fā)明使場(chǎng)景圖數(shù)據(jù)結(jié)構(gòu)在用于繪制之前,經(jīng)過(guò)一個(gè)預(yù)處理過(guò)程,發(fā)現(xiàn)那些影響圖形繪制效率的部分,在保證繪制正確地情況下,對(duì)場(chǎng)景圖數(shù)據(jù)結(jié)構(gòu)做出調(diào)整,提高了繪制效率。
采用上述繪制引的繪制方法步驟為(1)將繪制對(duì)象的模型信息、紋理信息、聲音信息以及相應(yīng)的Shader代碼在被調(diào)入場(chǎng)景圖之前被統(tǒng)一封裝在繪制對(duì)象的描述接口MaterialsDescription文件中,其中包括模型信息、紋理信息、聲音信息以及相應(yīng)得Shader代碼;(2)將上述的繪制對(duì)象信息通過(guò)場(chǎng)景圖中設(shè)置的Material Loader和MediaLoader分別調(diào)入渲染對(duì)象中,其中Material Loader負(fù)責(zé)繪制對(duì)象的狀態(tài)信息調(diào)入,Material Loader在將狀態(tài)信息調(diào)入之前,要按照Shader信息排序進(jìn)行靜態(tài)優(yōu)化,并調(diào)入渲染對(duì)象的狀態(tài)集中;Media Loader負(fù)責(zé)讀取頂點(diǎn)、紋理、音頻以及Shader代碼繪制對(duì)象本身的幾何信息,同時(shí)建立全局交叉數(shù)組并輔以索引數(shù)組,存入渲染對(duì)象的數(shù)據(jù)集中;(3)將渲染對(duì)象分為狀態(tài)集和數(shù)據(jù)集,狀態(tài)集包括頂點(diǎn)描述VertexDescription和片段Pixel Description描述,在渲染過(guò)程中,狀態(tài)集對(duì)繪制對(duì)象的狀態(tài)信息按照Shader信息繼續(xù)排序進(jìn)行動(dòng)態(tài)優(yōu)化,數(shù)據(jù)集對(duì)全局交叉數(shù)組和索引數(shù)組的更新進(jìn)行保存;
(4)將在渲染對(duì)象中渲染后的繪制對(duì)象送入繪制引擎進(jìn)行繪制,繪制引擎由繪制控制和狀態(tài)控制構(gòu)成,繪制控制將獲得的對(duì)象頂點(diǎn)、紋理、音頻以及Shader代碼的繪制對(duì)象本身數(shù)據(jù)信息分發(fā)給OpenGL或硬件代碼HLSL/CG/GLSL進(jìn)行繪制,而繪制對(duì)象的狀態(tài)描述信息則交由狀態(tài)控制進(jìn)行繪制狀態(tài)的改變,繪制控制和狀態(tài)控制兩者配合完成一個(gè)繪制對(duì)象的繪制過(guò)程。
本發(fā)明與現(xiàn)有技術(shù)相比的有益效果為(1)傳統(tǒng)的圖形系統(tǒng)將繪制對(duì)象的模型(幾何)、紋理、聲音等信息分別進(jìn)行讀取,除人為對(duì)應(yīng)之外,它們之間沒(méi)有聯(lián)系。對(duì)于一個(gè)復(fù)雜的繪制對(duì)象,如一架飛機(jī),如果能將其幾何、紋理、聲音甚至繪制狀態(tài)集合到一起,不僅可以提高完整性以及可擴(kuò)展性(當(dāng)一組信息有了明確的內(nèi)涵,就不難擴(kuò)展其外延),同時(shí)在復(fù)雜系統(tǒng)(同時(shí)承載上百個(gè)繪制對(duì)象)中能夠更好的加以獨(dú)立控制(這里的獨(dú)立控制是指如個(gè)例的更改上述信息等操作)。因此,本發(fā)明提出繪制對(duì)象描述接口,它可以通過(guò)xml文件進(jìn)行定義,接口對(duì)模型的幾何信息(對(duì)應(yīng)模型文件)、紋理信息(對(duì)應(yīng)紋理貼圖文件)、聲音信息(對(duì)應(yīng)音頻文件)、硬件繪制信息(Shader文件或代碼內(nèi)容)以及繪制所需狀態(tài)信息(如是否需要使用光照、繪制模式等)進(jìn)行統(tǒng)一封裝和描述,進(jìn)而可以對(duì)文件進(jìn)行擴(kuò)充,如增加視頻信息,控制信息等。
(2)提供對(duì)繪制對(duì)象的靜一動(dòng)態(tài)結(jié)合的狀態(tài)優(yōu)化過(guò)程,使場(chǎng)景進(jìn)一步優(yōu)化,提高了渲染效率,滿足了復(fù)雜場(chǎng)景的實(shí)時(shí)顯示。
(3)支持Shader的狀態(tài)集。將Shader對(duì)象融入繪制引擎,并根據(jù)狀態(tài)集的排序特點(diǎn)提供對(duì)Shader的排序和可擴(kuò)展的繼承式調(diào)用。
(4)將現(xiàn)有技術(shù)中的繪制引擎只為繪制控制的結(jié)構(gòu)分為繪制控制和狀態(tài)控制,即使繪制對(duì)象的狀態(tài)集合被狀態(tài)管理進(jìn)行監(jiān)控和管理,這樣做更好的加速繪制過(guò)程和狀態(tài)優(yōu)化,同時(shí)也使繪制效率大大提高。


圖1為圖形繪制引擎中通常的Shader調(diào)用示意圖;
圖2為本發(fā)明圖形繪制引擎中渲染對(duì)象及相關(guān)控制數(shù)據(jù)結(jié)構(gòu)示意圖;圖3為本發(fā)明的Materials Description的描述示意圖;圖4為本發(fā)明的Media Loader的結(jié)構(gòu)示意圖;圖5本發(fā)明的Material Loader結(jié)構(gòu)示意圖;圖6為本發(fā)明基于Shader信息排序的動(dòng)態(tài)優(yōu)化過(guò)程示意圖;圖7為本發(fā)明的場(chǎng)景圖中動(dòng)態(tài)優(yōu)化示例圖;圖8為本發(fā)明的Render Engine中狀態(tài)控制管理示意圖;圖9為本發(fā)明實(shí)現(xiàn)圖2繪制框架的類圖。
具體實(shí)施例方式
如圖2所示,本發(fā)明的繪制結(jié)構(gòu)分為以下幾個(gè)部分,它由繪制對(duì)象描述接口文件Materials Description、場(chǎng)景圖SceneGraph、渲染對(duì)象、繪制引擎RenderEngine組成,其中Materials Description通過(guò)xml文件進(jìn)行定義,對(duì)繪制對(duì)象的模型信息,包括幾何信息(對(duì)應(yīng)模型文件)、紋理信息(對(duì)應(yīng)紋理貼圖文件)、聲音信息(對(duì)應(yīng)音頻文件)、硬件繪制信息(Shader文件或代碼內(nèi)容)以及繪制所需狀態(tài)信息(如是否需要使用光照、繪制模式等)進(jìn)行統(tǒng)一封裝和描述;場(chǎng)景圖為描述虛擬場(chǎng)景的樹(shù)狀數(shù)據(jù)結(jié)構(gòu),其數(shù)據(jù)結(jié)構(gòu)由組節(jié)點(diǎn)和葉節(jié)點(diǎn)組成,將其在內(nèi)存中的存貯結(jié)構(gòu)分為材質(zhì)載入器Material Loader和介質(zhì)載入器MediaLoader兩部分,Material Loader負(fù)責(zé)讀取對(duì)象整體描述及繪制狀態(tài)信息,同時(shí)對(duì)該狀態(tài)信息以Shader信息排序進(jìn)行靜態(tài)優(yōu)化,并調(diào)入渲染對(duì)象的狀態(tài)集中,Media Loader負(fù)責(zé)讀取頂點(diǎn)、紋理、音頻以及Shader代碼繪制對(duì)象本身的幾何信息,同時(shí)建立全局交叉數(shù)組并輔以索引數(shù)組,并調(diào)入渲染對(duì)象的數(shù)據(jù)集中,Material Loader和Media Loader形成的繪制對(duì)象位于場(chǎng)景圖的葉節(jié)點(diǎn);渲染對(duì)象,分為狀態(tài)集和數(shù)據(jù)集,狀態(tài)集為Material Loader的讀取結(jié)果,MediaLoader為數(shù)據(jù)集的讀取結(jié)果,狀態(tài)集包括頂點(diǎn)描述Vertex Description和片段Pixel Description描述,在渲染過(guò)程中,狀態(tài)集對(duì)繪制對(duì)象的狀態(tài)信息按照Shader信息繼續(xù)排序進(jìn)行動(dòng)態(tài)優(yōu)化,數(shù)據(jù)集對(duì)全局交叉數(shù)組和索引數(shù)組的更新進(jìn)行保存;繪制引擎Render Engine由繪制控制和狀態(tài)控制構(gòu)成,繪制控制是對(duì)渲染對(duì)象進(jìn)行繪制過(guò)程中的控制,它根據(jù)渲染對(duì)象的數(shù)據(jù)集中的幾何信息分發(fā)給OpenGL或硬件代碼進(jìn)行繪制,解決進(jìn)行狀態(tài)優(yōu)化后的幾何信息,如頂點(diǎn)數(shù)據(jù)、法向量數(shù)據(jù)、顏色數(shù)據(jù)、紋理數(shù)據(jù)等在何時(shí)(不同對(duì)象的前后順序)以何種方式(三角形列表、條帶等)送入顯示卡進(jìn)行繪制;狀態(tài)控制,是對(duì)渲染對(duì)象進(jìn)行繪制過(guò)程中有關(guān)繪制狀態(tài)的控制,主要解決的是將渲染對(duì)象的相關(guān)繪制狀態(tài)(如光照、材質(zhì)、各種緩沖區(qū)等)送入顯示卡進(jìn)行設(shè)置,繪制控制和狀態(tài)控制兩者配合完成一個(gè)繪制對(duì)象的繪制過(guò)程。
如圖3所示,本發(fā)明的Materials Description描述了繪制對(duì)象及其幾何、繪制狀態(tài)信息,并已XML文件的形式進(jìn)行記錄。XML文件形式如下其中,MaterialName記錄該繪制對(duì)象的名稱,以便系統(tǒng)記錄并辨認(rèn);MaterialRenderState記錄繪制所需的繪制狀態(tài),提供給狀態(tài)管理模塊使用;MaterialFiles記錄了繪制對(duì)象的集合信息的文件,包含ModelFile以及TextureFile文件,在多紋理的狀態(tài)下,TextureFile可以重復(fù)出現(xiàn)。
如圖4所示,本發(fā)明的Media Loader充分采用了Plug-in的機(jī)制,可以隨著資源文件類型的擴(kuò)充不斷豐富繪制對(duì)象的內(nèi)容,其工作過(guò)程是獲取來(lái)自于Materials Description的繪制資源信息,如頂點(diǎn)、紋理和聲音等,這些資源實(shí)現(xiàn)需要保存在硬盤(pán)中,隨后Media Loader將根據(jù)資源文件名后綴激活Plug-in對(duì)象并由該對(duì)象完成資源讀取,讀取后的資源將被保存在繪制對(duì)象的數(shù)據(jù)集合中。
如圖5所示,本發(fā)明的Material Loader結(jié)構(gòu)類似于Media Loader,MaterialLoader的信息來(lái)源于Materials Description,它記錄了繪制對(duì)象繪制過(guò)程中所需的繪制狀態(tài),如光照等,這些信息被Material Loader獲取后直接保存到繪制對(duì)象的狀態(tài)集合中并參與后面的狀態(tài)排序。
為了加快繪制過(guò)程,本發(fā)明采用OpenGL中的交叉數(shù)組建立全局交叉數(shù)組,并且假設(shè)所有繪制對(duì)象均包含以上四種坐標(biāo)(假若缺少則自動(dòng)補(bǔ)零),將所有繪制對(duì)象的幾何信息在讀入時(shí)存入全局的交叉數(shù)組可以加速繪制,并輔以索引數(shù)組在交叉數(shù)組中進(jìn)行索引。
不難想象,一個(gè)復(fù)雜的場(chǎng)景包含復(fù)雜的對(duì)象,對(duì)應(yīng)的繪制狀態(tài)關(guān)系復(fù)雜,而繪制過(guò)程中繪制狀態(tài)的復(fù)雜嚴(yán)重影響硬件的繪制效率。例如,場(chǎng)景中包含1000架相同的飛機(jī),每架飛機(jī)擁有兩個(gè)繪制狀態(tài)(如機(jī)身是一種紋理狀態(tài),而駕駛艙的玻璃是另一種透明的紋理)。理想的繪制順序是先渲染所有機(jī)身,進(jìn)而渲染所有透明的玻璃。但事與愿違,由于系統(tǒng)是相繼的載入飛機(jī),最初形成的渲染序列使得繪制過(guò)程為機(jī)身、玻璃、機(jī)身、玻璃……因此,狀態(tài)不停切換導(dǎo)致繪制效率極低。所以,本發(fā)明提出了對(duì)狀態(tài)信息進(jìn)行優(yōu)化的方案,但狀態(tài)優(yōu)化過(guò)程同樣耗費(fèi)系統(tǒng)時(shí)間和空間,一味追求絕對(duì)的優(yōu)化對(duì)于整個(gè)渲染過(guò)程并非有利,因此必須在排序優(yōu)化時(shí)間復(fù)雜度和繪制時(shí)間復(fù)雜度之間平衡,因此,本發(fā)明提出的狀態(tài)優(yōu)化方法在讀入繪制對(duì)象時(shí)進(jìn)行靜態(tài)排序,進(jìn)而在動(dòng)態(tài)繪制過(guò)程中再次基礎(chǔ)上進(jìn)行局部的動(dòng)態(tài)成化排序。
Material Loader進(jìn)行Shader信息排序的靜態(tài)優(yōu)化過(guò)程為如圖6所示(1)初始化全局交叉數(shù)組,數(shù)組結(jié)構(gòu)采用標(biāo)準(zhǔn)庫(kù)Array模版,每單元內(nèi)容為OpenGL的枚舉型T2_C4_N3_V3結(jié)構(gòu);(2)初始化全局索引數(shù)組,數(shù)組結(jié)構(gòu)采用標(biāo)準(zhǔn)庫(kù)Array模版,每單元內(nèi)容為長(zhǎng)整形結(jié)構(gòu);(3)當(dāng)有新的繪制對(duì)象加入場(chǎng)景圖后,分別完成如下操作a.獲得繪制對(duì)象的紋理、顏色、法向量、位置數(shù)組指針;b.由于繪制數(shù)組頂點(diǎn)可能存在重復(fù),為了節(jié)省空間,進(jìn)行索引生成,保證每一個(gè)頂點(diǎn)在交叉數(shù)組中只出現(xiàn)一次,用索引描述具體引用順序,如頂點(diǎn)序列a,a,b,a,c,d,c,e,索引后的頂點(diǎn)序列為a,b,c,d,e,而索引序列為0,0,1,0,2,3,2,4。
c.獲得繪制對(duì)象的繪制狀態(tài)指針,并根據(jù)指針獲得紋理以及Shader信息;d.在全局交叉數(shù)組中搜索與該繪制對(duì)象具有相同Shader的數(shù)組部分,若發(fā)現(xiàn)則繼續(xù)搜索與該繪制對(duì)象具有相同紋理狀態(tài)的數(shù)組部分,如發(fā)現(xiàn)則將該頂點(diǎn)序列和索引序列分別存儲(chǔ)在全局交叉數(shù)組和索引數(shù)組中,若沒(méi)有對(duì)應(yīng)紋理的數(shù)組,則將該頂點(diǎn)序列和索引序列存儲(chǔ)在該Shader對(duì)應(yīng)的最后一個(gè)數(shù)組序列之后;若沒(méi)有與相同的Shader,則將該頂點(diǎn)序列和索引序列存儲(chǔ)在全局的交叉數(shù)組和索引數(shù)組之后;(4)在繪制對(duì)象中記錄其索引在全局索引中的起始點(diǎn)和長(zhǎng)度,完成靜態(tài)優(yōu)化。
如圖1所示,本發(fā)明的渲染對(duì)象中的狀態(tài)集的結(jié)構(gòu)采用面對(duì)對(duì)象的方式實(shí)現(xiàn),其中主要成員時(shí)狀態(tài)數(shù)組,記錄OpenGL繪制所需的狀態(tài),同時(shí)數(shù)組的存在也保證系統(tǒng)可以對(duì)狀態(tài)進(jìn)行優(yōu)化;數(shù)據(jù)集保存了繪制所需的頂點(diǎn)數(shù)組、紋理數(shù)組等。
如圖6所示,本發(fā)明的渲染對(duì)象中狀態(tài)集的基于Shader信息排序動(dòng)態(tài)優(yōu)化過(guò)程為(1)初始化繪制數(shù)組以便放置繪制對(duì)象序列;(2)依次獲得每一針的所需的繪制對(duì)象;(3)遍歷繪制數(shù)組搜索相應(yīng)Shader以及紋理信息的繪制狀態(tài)a.若為搜索到相似的Shader,則將該對(duì)象放入繪制數(shù)組的末端;b.若發(fā)現(xiàn)相似的Shader而沒(méi)有相似的紋理,則將該對(duì)象放入該Shader對(duì)應(yīng)的數(shù)組的相對(duì)末端;(4)當(dāng)發(fā)現(xiàn)Shader和紋理均相似時(shí)開(kāi)始進(jìn)行動(dòng)態(tài)排序a.按照耗時(shí)優(yōu)先級(jí)比較最耗時(shí)的狀態(tài)的是否有與該對(duì)象相同的,如不相同則插入相同對(duì)象的之后;b.若相同則在相同的對(duì)象組中繼續(xù)比較下一個(gè)耗時(shí)狀態(tài),如此往復(fù),直到所有狀態(tài)比較結(jié)束;c.當(dāng)最后一個(gè)狀態(tài)比較仍像同,則視為兩個(gè)繪制對(duì)象完全相同,進(jìn)而順序排列即可;(5)處理下一個(gè)繪制對(duì)象,直到所有帶繪制對(duì)象處理比較完畢;
(6)將繪制數(shù)組送入繪制引擎進(jìn)行繪制。
作為繪制對(duì)象主體,頂點(diǎn)的幾何、顏色、向量和紋理等坐標(biāo)信息被保存為數(shù)組。為了加快繪制過(guò)程,本發(fā)明采用OpenGL中的交叉數(shù)組對(duì)其進(jìn)行描述,并且假設(shè)所有繪制對(duì)象均包含以上四種坐標(biāo)(假若缺少則自動(dòng)補(bǔ)零)。將所有繪制對(duì)象的幾何信息在讀入時(shí)存入全局的交叉數(shù)組可以加速繪制,并輔以索引數(shù)組在交叉數(shù)組中進(jìn)行索引。
如圖7所示,一個(gè)繪制對(duì)象描述的是虛擬場(chǎng)景中的一個(gè)實(shí)際物體,而要描述多個(gè)實(shí)際的物體就需要場(chǎng)景圖維護(hù)多個(gè)繪制對(duì)象。根據(jù)場(chǎng)景圖的樹(shù)形結(jié)構(gòu),各個(gè)繪制對(duì)象之間繪制狀態(tài)集合元素可以進(jìn)行聚合一將相似的狀態(tài)向組節(jié)點(diǎn)進(jìn)行合并,并記錄在組節(jié)點(diǎn)的狀態(tài)集中,這樣做的好處是在繪制時(shí)盡量少的改變狀態(tài)。圖7中a圖表示的是當(dāng)組節(jié)點(diǎn)某狀態(tài)屬性(開(kāi)、關(guān)、必開(kāi)或必關(guān))為開(kāi)時(shí),那么其子節(jié)點(diǎn)的變化形如b圖,由于繪制對(duì)象A沒(méi)有設(shè)置該狀態(tài),那么A繼承G的設(shè)置,由于B與G狀態(tài)相同,那么B不變,而C明確指出狀態(tài)為關(guān),則C狀態(tài)不繼承G。c圖表示的是當(dāng)組節(jié)點(diǎn)的屬性Attrib為必開(kāi)AON時(shí),那么如d圖所示,A,B同b圖,而c圖則繼承G的屬性,變?yōu)殚_(kāi)。
如圖8所示,本發(fā)明的狀態(tài)控制過(guò)程示意圖,狀態(tài)優(yōu)化過(guò)程后,繪制對(duì)象之間的狀態(tài)切換已得到精簡(jiǎn),將這些繪制對(duì)象形成數(shù)祖繪制。狀態(tài)控制室對(duì)數(shù)祖中繪制對(duì)象的繪制狀態(tài)變量進(jìn)行控制的模塊,狀態(tài)變量名是OpenGL狀態(tài)機(jī)的內(nèi)容,這些變量的設(shè)置有StateHandler進(jìn)行調(diào)用,調(diào)用語(yǔ)句就是OpenGL API的內(nèi)容。
繪制物體是所必需指明的,如裁減面狀態(tài)、Alpha測(cè)試狀態(tài)、多邊形模式狀態(tài)、光源狀態(tài)等。這些狀態(tài)與圖2中繪制對(duì)象的狀態(tài)變量相對(duì)應(yīng),它們形成狀態(tài)集合State Set,這些信息由Material Loader從文件描述中獲得,提供給繪制引擎中的State Handler進(jìn)行優(yōu)化控制后送入硬件HW。
此外,對(duì)本發(fā)明的繪制控制過(guò)程依次獲得繪制對(duì)象,首先設(shè)置繪制狀態(tài),然后將頂點(diǎn)、顏色、紋理數(shù)組通過(guò)OpenGL API送入硬件完成繪制。
如圖9所示,為在具體的實(shí)現(xiàn)中實(shí)現(xiàn)了圖2的框架,支持Shader的繪制框架在保存了原有渲染模塊的基礎(chǔ)上實(shí)現(xiàn)了對(duì)其的繼承和擴(kuò)充。MaterialSet代表材質(zhì)信息,是一個(gè)廣泛的含義,其內(nèi)涵是一種硬件渲染的方式,包括繪制狀態(tài)集合、硬件Shader代碼集合以及渲染必要的參數(shù)集合(如光源參數(shù)、紋理參數(shù)等),如凹凸貼圖就可以被定義為一種MaterialSet,其包含頂點(diǎn)信息,凹凸紋理。IMaterial接口將場(chǎng)景圖對(duì)MaterialSet的封裝進(jìn)行公開(kāi),以導(dǎo)入相關(guān)材質(zhì)編輯器ATI的材質(zhì)結(jié)果;渲染過(guò)程Render Pass是Vertex和Pixel程序?qū)ο蟮娜萜?。同時(shí),Material還提供了對(duì)于Shader參數(shù)ShaderParameters的支持。
權(quán)利要求
1.一種基于狀態(tài)集的Shader三維圖形繪制框架,由繪制對(duì)象描述接口文件Materials Description、場(chǎng)景圖SceneGraph、渲染對(duì)象、繪制引擎RenderEngine組成,其特征在于所述的Materials Description通過(guò)xml文件進(jìn)行定義,對(duì)繪制對(duì)象的模型信息、紋理信息、聲音信息、Shader文件或代碼內(nèi)容以及繪制所需狀態(tài)信息進(jìn)行統(tǒng)一封裝和描述;所述的場(chǎng)景圖的內(nèi)存存貯結(jié)構(gòu)分為材質(zhì)載入器Material Loader和介質(zhì)載入器Media Loader兩部分,Material Loader負(fù)責(zé)讀取對(duì)象整體描述及繪制狀態(tài)信息,同時(shí)對(duì)繪制狀態(tài)信息以Shader信息排序進(jìn)行靜態(tài)優(yōu)化,并調(diào)入渲染對(duì)象的狀態(tài)集中,Media Loader負(fù)責(zé)讀取頂點(diǎn)、紋理、音頻以及Shader代碼繪制對(duì)象本身的幾何信息,同時(shí)建立全局交叉數(shù)組并輔以索引數(shù)組,并調(diào)入渲染對(duì)象的數(shù)據(jù)集中;所述的渲染對(duì)象,分為狀態(tài)集和數(shù)據(jù)集,狀態(tài)集包括頂點(diǎn)描述VertexDescription和片段Pixel Description描述,在渲染過(guò)程中,狀態(tài)集對(duì)繪制狀態(tài)信息按照Shader信息繼續(xù)排序進(jìn)行動(dòng)態(tài)優(yōu)化,數(shù)據(jù)集對(duì)全局交叉數(shù)組和索引數(shù)組的進(jìn)行更新保存;所述的繪制引擎由繪制控制和狀態(tài)控制構(gòu)成,繪制控制對(duì)渲染對(duì)象進(jìn)行繪制過(guò)程中的控制,它根據(jù)渲染對(duì)象的數(shù)據(jù)集中幾何信息分發(fā)給OpenGL或硬件代碼進(jìn)行繪制;狀態(tài)控制對(duì)渲染對(duì)象進(jìn)行繪制過(guò)程中有關(guān)繪制狀態(tài)的控制,繪制控制和狀態(tài)控制兩者配合完成一個(gè)繪制對(duì)象的繪制過(guò)程。
2.根據(jù)權(quán)利要求1所述的基于狀態(tài)集的Shader三維圖形繪制框架,其特征在于所述的繪制狀態(tài)信息以Shader信息排序進(jìn)行靜態(tài)優(yōu)化繪制狀態(tài)的靜態(tài)優(yōu)化過(guò)程為(1)初始化全局交叉數(shù)組,數(shù)組結(jié)構(gòu)采用標(biāo)準(zhǔn)庫(kù)Array模版,每單元內(nèi)容為OpenGL的枚舉型T2_C4_N3_V3結(jié)構(gòu);(2)初始化全局索引數(shù)組,數(shù)組結(jié)構(gòu)采用標(biāo)準(zhǔn)庫(kù)Array模版,每單元內(nèi)容為長(zhǎng)整形結(jié)構(gòu);(3)當(dāng)有新的繪制對(duì)象加入場(chǎng)景圖后,分別完成如下操作a.獲得繪制對(duì)象的紋理、顏色、法向量、位置數(shù)組指針;b.進(jìn)行索引生成,保證每一個(gè)頂點(diǎn)在交叉數(shù)組中只出現(xiàn)一次;c.獲得繪制對(duì)象的繪制狀態(tài)指針,并根據(jù)指針獲得紋理以及Shader信息;d.在全局交叉數(shù)組中搜索與該繪制對(duì)象具有相同Shader的數(shù)組部分,若發(fā)現(xiàn)則繼續(xù)搜索與該繪制對(duì)象具有相同紋理狀態(tài)的數(shù)組部分,如發(fā)現(xiàn)則將該頂點(diǎn)序列和索引序列分別存儲(chǔ)在全局交叉數(shù)組和索引數(shù)組中,若沒(méi)有對(duì)應(yīng)紋理的數(shù)組,則將該頂點(diǎn)序列和索引序列存儲(chǔ)在該Shader對(duì)應(yīng)的最后一個(gè)數(shù)組序列之后;若沒(méi)有與相同的Shader,則將該頂點(diǎn)序列和索引序列存儲(chǔ)在全局的交叉數(shù)組和索引數(shù)組之后;(4)在繪制對(duì)象中記錄其索引在全局索引中的起始點(diǎn)和長(zhǎng)度,完成靜態(tài)優(yōu)化。
3.根據(jù)權(quán)利要求1所述的基于狀態(tài)集的Shader三維圖形繪制框架,其特征在于所述的繪制狀態(tài)信息以Shader信息排序進(jìn)行動(dòng)態(tài)優(yōu)化過(guò)程為(1)初始化繪制數(shù)組以便防止繪制對(duì)象序列;(2)依次獲得每一針的所需的繪制對(duì)象;(3)遍歷繪制數(shù)組搜索相應(yīng)Shader以及紋理信息的繪制狀態(tài)a.若為搜索到相似的Shader,則將該對(duì)象放入繪制數(shù)組的末端;b.若發(fā)現(xiàn)相似的Shader而沒(méi)有相似的紋理,則將該對(duì)象放入該Shader對(duì)應(yīng)的數(shù)組的相對(duì)末端;(4)當(dāng)發(fā)現(xiàn)Shader和紋理均相似時(shí)開(kāi)始進(jìn)行動(dòng)態(tài)排序a.按照耗時(shí)優(yōu)先級(jí)比較最耗時(shí)的狀態(tài)的是否有與該對(duì)象相同的,如不相同則插入相同對(duì)象的之后;b.若相同則在相同的對(duì)象組中繼續(xù)比較下一個(gè)耗時(shí)狀態(tài),如此往復(fù),直到所有狀態(tài)比較結(jié)束;c.當(dāng)最后一個(gè)狀態(tài)比較仍像同,則視為兩個(gè)繪制對(duì)象完全相同,進(jìn)而順序排列即可;(5)處理下一個(gè)繪制對(duì)象,直到所有帶繪制對(duì)象處理比較完畢。
4.采用上述繪制框架的繪制方法,其特征在于包括下列步驟(1)將繪制對(duì)象的模型信息、紋理信息、聲音信息以及相應(yīng)的Shader代碼在被調(diào)入場(chǎng)景圖之前被統(tǒng)一封裝和描述在繪制對(duì)象的描述接口MaterialsDescription文件中;(2)將上述的繪制對(duì)象信息通過(guò)場(chǎng)景圖的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)中的MaterialLoader和Media Loader分別調(diào)入渲染對(duì)象中,其中Material Loader負(fù)責(zé)繪制對(duì)象的狀態(tài)信息調(diào)入,Material Loader在將狀態(tài)信息調(diào)入之前,要按照Shader信息排序進(jìn)行靜態(tài)優(yōu)化,并調(diào)入渲染對(duì)象的狀態(tài)集中;Media Loader負(fù)責(zé)讀取頂點(diǎn)、紋理、音頻以及Shader代碼繪制對(duì)象本身的幾何信息,同時(shí)建立全局交叉數(shù)組并輔以索引數(shù)組,并調(diào)入渲染對(duì)象的數(shù)據(jù)集中;(3)將渲染對(duì)象分為狀態(tài)集和數(shù)據(jù)集,狀態(tài)集包括頂點(diǎn)描述VertexDescription和片段Pixel Description描述,在渲染過(guò)程中,狀態(tài)集對(duì)繪制對(duì)象的狀態(tài)信息按照Shader信息繼續(xù)排序進(jìn)行動(dòng)態(tài)優(yōu)化,數(shù)據(jù)集對(duì)全局交叉數(shù)組和索引數(shù)組的更新進(jìn)行保存;(4)將在渲染對(duì)象中渲染后的繪制對(duì)象送入繪制引擎進(jìn)行繪制,繪制引擎由繪制控制和狀態(tài)控制構(gòu)成,繪制控制將獲得的對(duì)象頂點(diǎn)、紋理、音頻以及Shader代碼的繪制對(duì)象本身數(shù)據(jù)信息分發(fā)給OpenGL或硬件代碼進(jìn)行繪制,而繪制對(duì)象的狀態(tài)描述信息則交由狀態(tài)控制進(jìn)行繪制狀態(tài)的改變,繪制控制和狀態(tài)控制兩者配合完成一個(gè)繪制對(duì)象的繪制過(guò)程。
5.根據(jù)權(quán)利要求4所述的基于狀態(tài)集的Shader三維圖形繪制方法,其特征在于所述的繪制狀態(tài)信息以Shader信息排序進(jìn)行靜態(tài)優(yōu)化繪制狀態(tài)的靜態(tài)優(yōu)化過(guò)程為(1)初始化全局交叉數(shù)組,數(shù)組結(jié)構(gòu)采用標(biāo)準(zhǔn)庫(kù)Array模版,每單元內(nèi)容為OpenGL的枚舉型T2_C4_N3_V3結(jié)構(gòu);(2)初始化全局索引數(shù)組,數(shù)組結(jié)構(gòu)采用標(biāo)準(zhǔn)庫(kù)Array模版,每單元內(nèi)容為長(zhǎng)整形結(jié)構(gòu);(3)當(dāng)有新的繪制對(duì)象加入場(chǎng)景圖后,分別完成如下操作a.獲得繪制對(duì)象的紋理、顏色、法向量、位置數(shù)組指針;b.進(jìn)行索引生成,保證每一個(gè)頂點(diǎn)在交叉數(shù)組中只出現(xiàn)一次;c.獲得繪制對(duì)象的繪制狀態(tài)指針,并根據(jù)指針獲得紋理以及Shader信息;d.在全局交叉數(shù)組中搜索與該繪制對(duì)象具有相同Shader的數(shù)組部分,若發(fā)現(xiàn)則繼續(xù)搜索與該繪制對(duì)象具有相同紋理狀態(tài)的數(shù)組部分,如發(fā)現(xiàn)則將該頂點(diǎn)序列和索引序列分別存儲(chǔ)在全局交叉數(shù)組和索引數(shù)組中,若沒(méi)有對(duì)應(yīng)紋理的數(shù)組,則將該頂點(diǎn)序列和索引序列存儲(chǔ)在該Shader對(duì)應(yīng)的最后一個(gè)數(shù)組序列之后;若沒(méi)有與相同的Shader,則將該頂點(diǎn)序列和索引序列存儲(chǔ)在全局的交叉數(shù)組和索引數(shù)組之后;(4)在繪制對(duì)象中記錄其索引在全局索引中的起始點(diǎn)和長(zhǎng)度,完成靜態(tài)優(yōu)化。
6.根據(jù)權(quán)利要求1所述的基于狀態(tài)集的Shader三維圖形繪制方法,其特征在于所述的繪制狀態(tài)信息以Shader信息排序進(jìn)行動(dòng)態(tài)優(yōu)化過(guò)程為(1)初始化繪制數(shù)組以便防止繪制對(duì)象序列;(2)依次獲得每一針的所需的繪制對(duì)象;(3)遍歷繪制數(shù)組搜索相應(yīng)Shader以及紋理信息的繪制狀態(tài);a.若為搜索到相似的Shader,則將該對(duì)象放入繪制數(shù)組的末端;b.若發(fā)現(xiàn)相似的Shader而沒(méi)有相似的紋理,則將該對(duì)象放入該Shader對(duì)應(yīng)的數(shù)組的相對(duì)末端;(4)當(dāng)發(fā)現(xiàn)Shader和紋理均相似時(shí)開(kāi)始進(jìn)行動(dòng)態(tài)排序a.按照耗時(shí)優(yōu)先級(jí)比較最耗時(shí)的狀態(tài)的是否有與該對(duì)象相同的,如不相同則插入相同對(duì)象的之后;b.若相同則在相同的對(duì)象組中繼續(xù)比較下一個(gè)耗時(shí)狀態(tài),如此往復(fù),直到所有狀態(tài)比較結(jié)束;c.當(dāng)最后一個(gè)狀態(tài)比較仍像同,則視為兩個(gè)繪制對(duì)象完全相同,進(jìn)而順序排列即可;(5)處理下一個(gè)繪制對(duì)象,直到所有帶繪制對(duì)象處理比較完畢。
全文摘要
一種基于狀態(tài)集的Shader三維圖形繪制框架和繪制方法,將繪制對(duì)象的模型信息、紋理信息、聲音信息以及相應(yīng)的Shader代碼在被調(diào)入場(chǎng)景圖之前被統(tǒng)一封裝和描述在Materials Description文件中;通過(guò)場(chǎng)景圖的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)中的Material Loader和Media Loader分別調(diào)入渲染對(duì)象中,同時(shí)按照Shader信息排序進(jìn)行靜態(tài)和動(dòng)態(tài)優(yōu)化,然后將優(yōu)化后的繪制狀態(tài)信息送入繪制引擎進(jìn)行繪制,繪制引擎由繪制控制和狀態(tài)控制構(gòu)成,兩者配合完成一個(gè)繪制對(duì)象的繪制過(guò)程。本發(fā)明對(duì)Vertex Shader和Pixel Shader進(jìn)行了有效管理,充分利用狀態(tài)集的狀態(tài)封裝和排序功能,在提高了繪制效率的同時(shí),簡(jiǎn)化了接口調(diào)用,方便了程序員的開(kāi)發(fā)。
文檔編號(hào)G06T15/00GK1851753SQ20051012621
公開(kāi)日2006年10月25日 申請(qǐng)日期2005年11月28日 優(yōu)先權(quán)日2005年11月28日
發(fā)明者趙沁平, 何兵, 史遜, 萬(wàn)麗莉 申請(qǐng)人:北京航空航天大學(xué)
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
留坝县| 平度市| 海安县| 昭通市| 巴林右旗| 中西区| 孝感市| 泰兴市| 浦城县| 织金县| 云阳县| 南华县| 东海县| 彰化县| 温泉县| 贵溪市| 江永县| 鄂托克旗| 马关县| 乌拉特中旗| 洛南县| 叶城县| 苍山县| 鄱阳县| 扎兰屯市| 龙里县| 安福县| 德令哈市| 高台县| 黎川县| 甘肃省| 南木林县| 景洪市| 旬邑县| 科技| 莎车县| 湘潭县| 济阳县| 巨鹿县| 田阳县| 墨脱县|