999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于IoC模式的D3D渲染工作流引擎設(shè)計(jì)

2010-01-16 01:58:00
關(guān)鍵詞:引擎設(shè)計(jì)

熊 偉

(武漢大學(xué)計(jì)算機(jī)學(xué)院,湖北武漢430079)

隨著DirectX的發(fā)展和成熟,DirectX已經(jīng)成為當(dāng)今游戲和多媒體開發(fā)的首選技術(shù)。然而,DirectX的功能都是以COM組件的形式提供的,應(yīng)用程序更多地采用了面向過程的設(shè)計(jì)思想,這種方式使得應(yīng)用程序的業(yè)務(wù)邏輯和DirectX的API混合在一起,破壞了系統(tǒng)的模塊化,增大了模塊間的耦合度,系統(tǒng)也不易于維護(hù)和擴(kuò)展。

本文提出一個基于IoC模式的D3D(DirectX中的Direct3D)渲染工作流引擎的設(shè)計(jì)方案,該方案將剝離應(yīng)用程序邏輯和D3D實(shí)現(xiàn)之間的關(guān)系,采用工作流的設(shè)計(jì)思想來封裝D3D的API,并使用IoC容器來創(chuàng)建構(gòu)件和組裝其依賴關(guān)系,最后通過實(shí)例來驗(yàn)證本引擎的可行性和實(shí)現(xiàn)效果。

1 3D渲染過程簡介

3D渲染過程就是三維物體的成像過程。三維物體通過建模的微分方法,根據(jù)不同的精確程度,將表面切分為多個三角形面,從而將表面的繪制轉(zhuǎn)化為三角形面的繪制。渲染由眾多三角形面組成的三維場景,需要引入多個坐標(biāo)系,經(jīng)過這些坐標(biāo)系的轉(zhuǎn)化后,三維場景最終會作為一個二維的場景被繪制出來。[1]

在三維場景中,每個物體最初都擁有自己的局部坐標(biāo)系,局部坐標(biāo)系為物體進(jìn)行三角形頂點(diǎn)的坐標(biāo)量化。然后每個場景都有一個世界坐標(biāo)系,該坐標(biāo)系描述了各個物體之間的位置關(guān)系(如果有光照,還需要對頂點(diǎn)的顏色值進(jìn)行計(jì)算)。這時,一個攝影坐標(biāo)系將會描述該場景的取景范圍,不可見的三角形面將被裁剪。對攝影坐標(biāo)系的頂點(diǎn)進(jìn)行剪裁和透視投影處理后,將可以得到輸出于視覺區(qū)域中的投影坐標(biāo)系的頂點(diǎn)信息。最后,將平面投影的點(diǎn)變換到計(jì)算機(jī)屏幕的視口中,如果采用了紋理貼圖,還需要對像素顏色值進(jìn)行混色計(jì)算。固化渲染代碼以管道流水線的形式來實(shí)現(xiàn)三維物體的渲染,D3D提供了API來簡化這個渲染過程,它通過設(shè)置該管道流水線的各種過程參數(shù),最終啟動該管道流水線的執(zhí)行代碼來實(shí)現(xiàn)三維的圖形顯示。[2-5]

傳統(tǒng)的D3D應(yīng)用程序設(shè)計(jì)是基于面向過程思想的,應(yīng)用程序在開啟渲染模式后,根據(jù)程序邏輯來設(shè)置管道流水線的過程參數(shù),并最終將結(jié)果繪制在顯示器上。這種面向過程的設(shè)計(jì)思想導(dǎo)致了程序邏輯和D3D的具體實(shí)現(xiàn)混合在一起,使得程序設(shè)計(jì)復(fù)雜、模塊化差、耦合性低和易讀性差。本引擎將以面向?qū)ο蟮脑O(shè)計(jì)思想來封裝D3D的API,并將管道流水線的渲染過程抽象為工作流,最終基于IoC容器來配置該工作流,使D3D渲染過程更為靈活和方便,從而徹底剝離了應(yīng)用程序和D3D的具體實(shí)現(xiàn)之間的關(guān)系。

2 引擎設(shè)計(jì)

引擎的主要任務(wù)是將應(yīng)用程序與D3D具體實(shí)現(xiàn)分離,使得應(yīng)用程序充當(dāng)生產(chǎn)工人的角色,而D3D具體實(shí)現(xiàn)充當(dāng)工作流的角色。引擎將按照工作流的設(shè)計(jì)思想將D3D對象和API封裝成工作流構(gòu)件,并提供相應(yīng)的接口給應(yīng)用程序,從而保證兩者的分離和通信。另外,為了進(jìn)一步降低構(gòu)件間的耦合,引擎將引入 IoC容器來托管引擎的主要構(gòu)件對象。引擎設(shè)計(jì)將包括工作流設(shè)計(jì)和IoC容器設(shè)計(jì)兩個部分,其中,工作流設(shè)計(jì)主要是依照管道流水線的渲染過程來設(shè)計(jì)各個構(gòu)件等,并按照抽象工廠的設(shè)計(jì)模式來抽象C++對象;IoC容器主要是現(xiàn)實(shí)對象的動態(tài)創(chuàng)建和采用XML來配置三維場景。

2.1 工作流設(shè)計(jì)

工作流中的對象按照角色分為基本構(gòu)件、過程構(gòu)件、管理器和處理器[6]。其關(guān)系如圖1所示。

圖1 工作流構(gòu)件的關(guān)系

2.1.1 基本構(gòu)件

基本構(gòu)件是工作流中的基本單位,其作用是實(shí)現(xiàn)工作流分配給自己的任務(wù),而無需知道自己在整個工作流中的作用。它主要包括4個接口:創(chuàng)建、設(shè)置參數(shù)、獲取參數(shù)和釋放,記為M={C,S,G,R},當(dāng)一個基本構(gòu)件被創(chuàng)建后,外界將需要對其進(jìn)行一些設(shè)置,然后在被釋放之前,外界都可以在它身上獲取到需要的信息和接口。

在引擎中,基本構(gòu)件包括了頂點(diǎn)、索引、紋理、材質(zhì)、燈光等D3D基本元素,比如,類 GLight描述了D3D中的燈光的信息和行為,它封裝了D3DLIGHT9對象,并提供了相應(yīng)接口(C,S,G,R),其子類 GPointLight、GDirectionalLight和GSpotLight分別實(shí)現(xiàn)了點(diǎn)光源、平行光和聚光源的具體設(shè)置和行為(重載了父類的C,S,G,R)。

2.1.2 過程構(gòu)件

過程構(gòu)件描述了基本構(gòu)件之間的關(guān)系和工作流的邏輯流程,其作用是按照工作流設(shè)計(jì)出流程路線和邏輯關(guān)系。主要包括4個接口:創(chuàng)建、裝配、運(yùn)行和釋放,記為L={C,A,P,R},過程構(gòu)件一般只有一個實(shí)例,當(dāng)它被創(chuàng)建后,外界將其需要的所有基本構(gòu)件都裝配在其實(shí)例上,然后運(yùn)行該實(shí)例,直至它被釋放。在引擎中,類 GScene實(shí)現(xiàn)了D3D管道渲染的過程,它首先啟動渲染,然后分別獲取裝配在它身上的頂點(diǎn)、索引、紋理、材質(zhì)、燈光等信息,通過預(yù)定的渲染方式來渲染場景,直至渲染過程結(jié)束。

2.1.3 管理器

管理器負(fù)責(zé)管理所有基本構(gòu)件和過程構(gòu)件實(shí)例,其主要接口包括創(chuàng)建、新建新構(gòu)件、查找構(gòu)件、刪除構(gòu)件和釋放,記為 G={C,N,F,D,R}。管理器分為基本構(gòu)件管理器和過程構(gòu)件管理器,基本構(gòu)件管理器來創(chuàng)建和釋放基本構(gòu)件實(shí)例,過程構(gòu)件管理器則負(fù)責(zé)創(chuàng)建和釋放過程構(gòu)件。管理器的主要作用是對所有散亂的基本和過程構(gòu)件集中管理,增強(qiáng)工作流的靈活性,實(shí)現(xiàn)高內(nèi)聚、低耦合的目的。在引擎中,每個基本構(gòu)件和過程構(gòu)件都有其對應(yīng)的管理器,如類GTextureHolder為紋理對象的管理器,而 GMaterialHolder為材質(zhì)對象的管理器。

2.1.4 處理器

處理器負(fù)責(zé)執(zhí)行工作流,其主要接口包括創(chuàng)建、輸入、處理、輸出和釋放,記為 P={C,I,P,O,R}。處理器首先從管理構(gòu)件中獲取到過程構(gòu)件實(shí)例,然后根據(jù)初始化信息獲取到所有過程構(gòu)件實(shí)例所需的基本構(gòu)件實(shí)例,然后將這些基本構(gòu)件實(shí)例組裝到過程構(gòu)件實(shí)例中,運(yùn)行過程構(gòu)件實(shí)例,在運(yùn)行過程中,處理器會根據(jù)用戶輸入或其他消息來創(chuàng)建新的基本構(gòu)件實(shí)例或釋放那些不再需要的基本構(gòu)件實(shí)例,還會通過實(shí)例的設(shè)置接口來初始化和更新所有的實(shí)例,直至程序結(jié)束。

在引擎中,類 GGraphics實(shí)現(xiàn)了處理器的功能,它封裝了 IDirect3DDevice9對象,完成了 d3d的渲染過程,并對邏輯程序提供了相應(yīng)接口,使邏輯程序可以更新最終的輸出結(jié)果。

2.1.5 抽象工廠模式設(shè)計(jì)

工作流的運(yùn)行原理是首先由處理器來做一些初始化的工作,然后根據(jù)輸入信息從管理器中獲取到所需對象(管理器會根據(jù)處理器的要求來創(chuàng)建對象),并將那些基本構(gòu)件裝配到過程構(gòu)件上。然后處理器啟動過程構(gòu)件,由于過程構(gòu)件中已定義好所需基本構(gòu)件的接口,它將按照自己定義的流程來運(yùn)行,運(yùn)行結(jié)束后,處理器結(jié)束過程構(gòu)件。

可見,工作流是基于不同構(gòu)件之間的接口來設(shè)計(jì)的,它并不依賴于具體的對象實(shí)例,這種使用抽象接口來創(chuàng)建一組相關(guān)或依賴的產(chǎn)品組的模式,可以通過抽象工廠來實(shí)現(xiàn)。這樣,工作流就從具體的產(chǎn)品中被解耦,圖2是本引擎采用抽象工廠所實(shí)現(xiàn)的構(gòu)件間的關(guān)系及其渲染過程。

圖2 引擎渲染時序圖

在圖2中,所有構(gòu)件都是通過接口來實(shí)現(xiàn)的,引擎并不知道所需要渲染的對象有哪些,它只需要從一個XML的文檔中動態(tài)去解析各種所需對象的信息,然后裝配到 GScene對象中,一切渲染的過程都由 GScene對象來完成,這樣就徹底分離了應(yīng)用程序與引擎間的關(guān)系。

2.2 IOC容器設(shè)計(jì)

在工作流中,不同類型的構(gòu)件之間存在著各種依賴關(guān)系,導(dǎo)致了構(gòu)件間耦合度低,裝配靈活性低等缺點(diǎn),為了協(xié)調(diào)各構(gòu)件的依賴關(guān)系,提高構(gòu)件的重用性和移植性,運(yùn)用 IoC容器[6]來配置構(gòu)件間的關(guān)系是一個很好的方法。

IoC指不直接創(chuàng)建對象,而只是描述它們的創(chuàng)建方式,容器負(fù)責(zé)來將這些聯(lián)系在一起。這種控制權(quán)由應(yīng)用代碼轉(zhuǎn)到了外部容器的行為,稱為反轉(zhuǎn)。IoC的主要作用有:(1)描述組件間的依賴關(guān)系,減小其創(chuàng)建成本;(2)對組件的組裝可以脫離于代碼控制,減小其耦合度;(3)充分利用組裝的靈活性,便于測試。

IoC容器的主要任務(wù)是根據(jù)對象的配置文件(一般為XML)去動態(tài)地創(chuàng)建該對象,并完成配置文件所規(guī)定的依賴關(guān)系的組裝。但是,C++本身并不具備反射機(jī)制,以至于無法直接通過C++來動態(tài)創(chuàng)建對象并動態(tài)調(diào)用其方法,所以容器需要其他實(shí)現(xiàn)動態(tài)創(chuàng)建對象的機(jī)制。另外,為了保證某些特殊對象的唯一性,容器將采用單例的設(shè)計(jì)模式來實(shí)現(xiàn)這個特性。

2.2.1 對象的動態(tài)創(chuàng)建

對象的動態(tài)創(chuàng)建一般是通過反射機(jī)制來實(shí)現(xiàn)了,而C++本身并沒有反射機(jī)制,為了在程序運(yùn)行時動態(tài)地識別對象類型并創(chuàng)建對象,就必須把那些需要具備該能力的類信息記錄起來,這樣才可以實(shí)現(xiàn)動態(tài)創(chuàng)建。

本系統(tǒng)用類 GRuntimeClass來描述所有有用的類信息,并提供靜態(tài)方法CreateObject來動態(tài)創(chuàng)建對象,這樣,每個需要動態(tài)創(chuàng)建的類(如GTexture)都需要有一個對應(yīng)的 GRuntimeClass對象(如classGTexture),所以在定義 GTexture時,需要額外地定義一個靜態(tài)對象classGTexture,并對classGTexture初始化。

由于對象的動態(tài)創(chuàng)建往往是根據(jù)其名字來創(chuàng)建的,所以可以將這些 GRuntimeClass對象放進(jìn)一個全局的map(GRuntimeClass::m_mpRuntimeClasses)中,這樣就可以快速地根據(jù)名字尋找到對應(yīng)的 GRuntimeClass對象并動態(tài)地創(chuàng)建所需的對象了。當(dāng)然,這些額外地工作可以通過宏來簡化,比如使用DECLARE_DYNCREATE來申明classGTexture和 CreateObject,而使用 IMPL EMENT_DYNCREATE來實(shí)現(xiàn)和初始化。

在創(chuàng)建對象時,有一種情況是需要特別處理的,就是有些類它只有一個實(shí)例,為了實(shí)現(xiàn)這種特性,本引擎采用了單例的設(shè)計(jì)模式。在傳統(tǒng)的單例模式中,單例類有一個靜態(tài)的對象,并提供一個全局的訪問點(diǎn),通過這種方式來保證類對象的唯一性。在本引擎中,這個靜態(tài)對象(m_pSingletonObject)和全局訪問點(diǎn)(CreateSingleton)被移到了 GRuntimeClass中,這樣通過 GRuntime-Class的CreateObject方法來動態(tài)地創(chuàng)建對象,用CreateSingleton方法來動態(tài)地創(chuàng)建單例。

2.2.2 配置文件解析

IoC容器需要實(shí)現(xiàn)根據(jù)給定格式的配置文件(本引擎采用XML)來動態(tài)地創(chuàng)建對象,并組裝其依賴的其他對象。本引擎用類 GIoCContainer來實(shí)現(xiàn)這個功能,GIoCContainer有一個靜態(tài)的IXMLDOMDocumentPtr類型的成員變量pXMLDoc,首先通過該變量的load方法來讀取配置文件,然后,GIoCContainer提供了一個靜態(tài)方法GObject* CreateObject(char*beanId)來動態(tài)創(chuàng)建對象,并組裝其依賴對象,該方法算法如下:

GObject* CreateObject(char*beanId){

獲取靜態(tài)對象pXMLDoc;

if(pXMLDoc==NULL)

載入對應(yīng)的XML文件;

獲取 beans節(jié)點(diǎn)的 IXMLDOMElementPtr對象;

遍歷beans節(jié)點(diǎn)中的所有bean節(jié)點(diǎn)

{

if(bean節(jié)點(diǎn)的id為beanId)

{

if(bean節(jié)點(diǎn)的scope不為prototype)//不是單例

{

object = GRuntimeClass.CreateObject(bean的class);

遍歷bean節(jié)點(diǎn)中的所有property節(jié)點(diǎn)

{

propertyInstance= CreateObject(property的ref);

動態(tài)調(diào)用方法使object的名為property的name的對象為propertyInstance;

}

}

else{//單例

object = GRuntimeClass.CreateSingleton(bean的class);

遍歷bean節(jié)點(diǎn)中的所有property節(jié)點(diǎn)

{

if(object的名為property的name的對象==NULL)

{

propertyInstance= CreateObject(property的ref);

動態(tài)調(diào)用方法使object的名為property的name的對象為propertyInstance;

}

}

}

return object;

}

}

return NULL;

}

3 實(shí)現(xiàn)

本引擎實(shí)現(xiàn)了從一個場景配置文件來動態(tài)生成相關(guān)對象,這些對象將作為工作流的輸入數(shù)據(jù),當(dāng)工作流啟動后,工作流按照其流程來渲染所有三維物體。配置文件獨(dú)立于程序,當(dāng)需要修改場景時,引擎無需修改源碼,而只需要修改相應(yīng)的配置項(xiàng)則可。下面是使用該引擎實(shí)現(xiàn)的一個具體實(shí)例,在該實(shí)例中,將渲染一個草地和藍(lán)天的場景,草地是個平板對象,天空是個半球體。實(shí)現(xiàn)該實(shí)例,只需在場景配置文件中添加上這兩個對象,配置文件如下:

<bean id="ground"class="GPlane"scope="prototype">

<property name="m_strTexturePath"value="c:ground.jpg"></property>

<property name="m_fLength"value="800"></property>

<property name="m_fWidth"value="800"></property>

</bean>

<bean id="sky"class="GGlobe"scope="prototype">

<property name="m_fRadius"value="800"></property>

<property name="m_dAlfa"value="15"></property>

<property name="m_dBeta"value="15"></property>

</bean>

<bean id="gview"class="GView">

<property name="m_lpModels">

<list>

<ref bean="ground"/>

<ref bean="sky"/>

</list>

</property>

</bean>

圖3顯示了該實(shí)例的最終渲染效果。

圖3 實(shí)例渲染效果

4 結(jié)束語

D3D是當(dāng)前3D渲染的主流技術(shù),它實(shí)現(xiàn)了管道流水線渲染三維物體的過程。D3D的API采用COM組件的形式,這樣使得程序的設(shè)計(jì)繁雜化,易讀性較差,而以一般的面向?qū)ο笏枷雭矸庋b則增加了各個對象的耦合。本引擎采用了以工作流的設(shè)計(jì)思想抽象了管道流水線的渲染過程,并采用IoC容器來協(xié)調(diào)工作流各構(gòu)件的依賴關(guān)系,提高構(gòu)件的重用性和移植性,從而剝離了應(yīng)用程序的邏輯與D3D具體渲染的關(guān)系。

本引擎的創(chuàng)新點(diǎn)在于:(1)采用工作流的設(shè)計(jì)思想來設(shè)計(jì)并封裝D3D的API;(2)利用 IoC容器在構(gòu)件組裝方面的開發(fā)性來配置引擎中的對象。目前還只能渲染一些基本幾何體,下一步將會以更開放的形式,來渲染復(fù)雜的骨骼動畫等。

[1] 林少芬,姜明.CAXA三維實(shí)體設(shè)計(jì)教程[M].北京:機(jī)械工業(yè)出版社,2005.

[2] 李江平.Direct X中3DMAX模型的應(yīng)用[J].湖北工學(xué)院學(xué)報(bào),2003(4):58-59.

[3] 況衛(wèi)飛,彭四偉.三維渲染引擎編輯器的研究[J].電子設(shè)計(jì)工程,2009(9):91-92.

[4] 周演,陳天滋.基于Direct3D的大規(guī)模地形渲染技術(shù)研究[J].鄭州輕工業(yè)學(xué)院學(xué)報(bào):自然科學(xué)版,2008(6):107-111.

[5] 杜園園,侯彤璞,郭艷霞.Direct3D場景中3D模型的處理方法[J].遼寧石油化工大學(xué)學(xué)報(bào),2008(4):86-90.

[6] 朱啟明,汪詩林.基于IOC容器的工作流引擎的設(shè)計(jì)[J].微計(jì)算機(jī)信息,2008(21):10-12.

猜你喜歡
引擎設(shè)計(jì)
以學(xué)促干 挺膺擔(dān)當(dāng) 激活砥礪前行的紅色引擎
何為設(shè)計(jì)的守護(hù)之道?
《豐收的喜悅展示設(shè)計(jì)》
流行色(2020年1期)2020-04-28 11:16:38
瞞天過海——仿生設(shè)計(jì)萌到家
三生 三大引擎齊發(fā)力
藍(lán)谷: “涉藍(lán)”新引擎
商周刊(2017年22期)2017-11-09 05:08:31
設(shè)計(jì)秀
海峽姐妹(2017年7期)2017-07-31 19:08:17
有種設(shè)計(jì)叫而專
Coco薇(2017年5期)2017-06-05 08:53:16
無形的引擎
河南電力(2015年5期)2015-06-08 06:01:46
基于Cocos2d引擎的PuzzleGame開發(fā)
主站蜘蛛池模板: 亚洲a免费| 亚洲成av人无码综合在线观看| 凹凸精品免费精品视频| 免费一级α片在线观看| 人妻中文久热无码丝袜| 91啪在线| 国产精品99在线观看| www.精品国产| 国内丰满少妇猛烈精品播| 日韩人妻少妇一区二区| 东京热高清无码精品| 91在线精品免费免费播放| 九九精品在线观看| 欧美黄色网站在线看| 97国产在线观看| 国产免费精彩视频| 亚洲中文制服丝袜欧美精品| 久久综合九色综合97婷婷| 国产在线精品99一区不卡| 性激烈欧美三级在线播放| a亚洲视频| 欧美日韩国产一级| 国产综合色在线视频播放线视| 久草美女视频| 成人亚洲视频| 国产成人三级| 91人妻日韩人妻无码专区精品| 国产高清无码第一十页在线观看| 97精品国产高清久久久久蜜芽| 57pao国产成视频免费播放| 亚洲色图欧美在线| 亚洲成人一区在线| 国产在线小视频| 亚洲第一综合天堂另类专| 亚洲综合亚洲国产尤物| 久久人人爽人人爽人人片aV东京热| 被公侵犯人妻少妇一区二区三区| 国产精品 欧美激情 在线播放 | 91小视频在线观看免费版高清| 亚洲人成色在线观看| 老色鬼欧美精品| 久久精品最新免费国产成人| 国产精品无码翘臀在线看纯欲| 欧美有码在线观看| 91原创视频在线| 91po国产在线精品免费观看| 国产网站免费看| 中文国产成人精品久久| 亚洲人成网站观看在线观看| 国产三级a| 日韩成人在线网站| 2020国产精品视频| 高清免费毛片| 成人免费午间影院在线观看| 波多野结衣视频网站| 丰满人妻一区二区三区视频| 97国产成人无码精品久久久| 青青青国产免费线在| 77777亚洲午夜久久多人| 久久久受www免费人成| aaa国产一级毛片| 国产精品免费福利久久播放| 国产欧美亚洲精品第3页在线| 夜夜高潮夜夜爽国产伦精品| 91 九色视频丝袜| 草草线在成年免费视频2| 色成人综合| 国产精品亚洲综合久久小说| 久久熟女AV| 精品久久综合1区2区3区激情| 亚洲 成人国产| 91在线精品麻豆欧美在线| 亚洲无限乱码| 亚洲精品国产综合99| 国产精品免费入口视频| 日韩精品成人网页视频在线| 国产高清又黄又嫩的免费视频网站| 亚洲欧洲国产成人综合不卡| 亚洲成在人线av品善网好看| 97视频精品全国免费观看| 在线观看国产小视频| 麻豆国产精品一二三在线观看|