亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        DirectX3D中的霧化效果及其實(shí)現(xiàn)

        2010-02-23 07:26:58徐成虎田東平
        關(guān)鍵詞:圖形學(xué)頂點(diǎn)應(yīng)用程序

        徐成虎, 田東平

        (1.寶雞文理學(xué)院教育科學(xué)與技術(shù)系, 陜西 寶雞 721007; 2.寶雞文理學(xué)院計(jì)算機(jī)軟件研究所, 陜西 寶雞 721007)

        0 前 言

        霧化是Direct3D程序模擬真實(shí)世界的云霧、水汽和灰塵等自然景觀.在霧氣比較嚴(yán)重的地區(qū),往往距離觀察點(diǎn)很近的物體比較清晰,而遠(yuǎn)處的物體隨著距離的增加會變得越來越模糊,霧化效果正是能夠增加三維場景真實(shí)感的一種技術(shù).隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,越來越多的計(jì)算機(jī)硬件支持更多、更好、更快的三維圖形顯示效果,利用Direct3D開發(fā)的實(shí)時(shí)三維圖形已經(jīng)可以和電影效果相媲美.

        1 霧化計(jì)算及其實(shí)現(xiàn)

        有兩種方法可以將霧化添加到場景中:像素霧化和頂點(diǎn)霧化.本文著重闡述了霧化方程式中用到的公式以及實(shí)現(xiàn)頂點(diǎn)霧化和像素霧化.一個(gè)應(yīng)用程序使用頂點(diǎn)渲染可以實(shí)現(xiàn)霧化,與此同時(shí),亦可實(shí)現(xiàn)像素霧化.

        C++應(yīng)用程序可以通過變換距離進(jìn)行霧化效果處理,從而改變場景中物體的顏色.枚舉型D3DFOGMODE識別包含了3種霧化公式[1],所有的公式都計(jì)算一個(gè)霧化因子并作為距離函數(shù),在此假定參數(shù)由應(yīng)用程序設(shè)置.

        1.1 線性霧化

        1.2 指數(shù)霧化

        像素霧化和頂點(diǎn)霧化都支持線性及指數(shù)霧化公式.用D3DFOG_EXP設(shè)置f=1/ed×density,其中e為自然對數(shù)的基(近似為2.718 28),density是從0到1之間變化的任意霧密度,d含義同上.用D3DFOG_EXP2設(shè)置f=1/e(d×density)2,其中e,density和d的含義均同前所述.

        系統(tǒng)將霧化因子保存在頂點(diǎn)鏡面顏色的Alpha組件中.如果應(yīng)用程序執(zhí)行自身的變換和光照,則可手動地插入霧化因子的值,系統(tǒng)在渲染階段會用到它,圖1給出了這些公式的量化曲線.

        圖1 不同指數(shù)和霧密度對應(yīng)的量化曲線

        D3DFOG_LINEAR以1作為起始點(diǎn),0.0作為最大點(diǎn),它不是相對于近平面或遠(yuǎn)平面進(jìn)行測量.當(dāng)D3D計(jì)算霧化處理效果時(shí),從前述3個(gè)方程式中選擇一個(gè)用于計(jì)算混合公式中所需的霧化因子,公式為C=f×Ci+(1-f)×Cf.此公式通過霧化因子f可以對當(dāng)前多邊形C的顏色進(jìn)行有效換算,并將它們的乘積加到霧化顏色C上,這主要是對霧化因子逐位求逆來進(jìn)行計(jì)算,結(jié)果顏色值作為一個(gè)距離因子是霧化顏色和物體原顏色的混合.該公式適用于支持所有DirectX7.0以及其后的更高設(shè)備.

        1.3 霧化參數(shù)

        設(shè)備渲染狀態(tài)控制霧化參數(shù).像素霧化和頂點(diǎn)霧化均支持前述所有的霧化公式.枚舉型D3DFOGMODE定義了一些常量,可以用它們來標(biāo)識D3D所要使用的霧化公式,其中渲染狀態(tài)D3DRS_FOGTABLEMODE控制像素霧化方式,D3DRS_FOGVERTEXMODE控制頂點(diǎn)霧化方式.當(dāng)使用線性霧化公式時(shí),可通過渲染狀態(tài)D3DRS_FOGSTART與D3DRS_FOGEND設(shè)置初始距離和最大距離.系統(tǒng)如何識別這些值,主要依賴于應(yīng)用程序所使用的霧化類型.當(dāng)使用像素霧化時(shí),若基于z和w的深度被使用,則相應(yīng)的霧化類型與它們的起始和最大單元對應(yīng)關(guān)系如下:

        Fog type Fog start/end units

        Pixel(Z) Device space[0.0,1.0]

        Pixel(W) Camera space

        Vertex Camera space

        當(dāng)使用一個(gè)指數(shù)霧化公式時(shí),渲染狀態(tài)D3DRS_FOGDENSITY控制所用的霧化密度.霧化密度實(shí)際上是一個(gè)加權(quán)因子,它在包含端點(diǎn)1的0~1范圍內(nèi)變化,用來縮放指數(shù)中的距離.系統(tǒng)所使用的霧化混合的顏色通過渲染狀態(tài)設(shè)備D3DRS_FOGCOLOR來控制.

        1.4 霧化混合

        正如在霧化公式中所描述的,霧化混合指霧化因子和物體顏色在場景中共同作用,以產(chǎn)生最終的效果顏色[2-4].渲染狀態(tài)D3DRS_FOGENABLE控制霧化混合,設(shè)置渲染狀態(tài)為TRUE時(shí)使用霧化混合的代碼示例如下,缺省值為FALSE:

        //For this example,g_pDevice is a valid pointer

        //to an IDirect3DDevice9 interface.

        HRESULT hr;

        hr= g_pDevice-> SetRenderState (D3DRS_FOGENABLE,TRUE);

        If FAILED(hr)

        Return hr;

        1.5 霧化顏色

        像素霧化和頂點(diǎn)霧化的顏色都是通過渲染狀態(tài)D3DRS_FOGCOLOR來進(jìn)行設(shè)置,渲染狀態(tài)值可以是任意RGB色,指定值為RGBA色,其中Alpha組件忽略不計(jì).如下的C++示例將霧化顏色設(shè)置為白色:

        /*For this example,the d3dDevice variable is a

        /* valid pointer to an IDirect3DDevice9 interface.

        HRESULT hr;

        hr=d3dDevice->SetRenderState(

        D3DRS_FOGCOLOR,

        0x00FFFFFF);//Highest 8 bits are not used.

        If (FAILED(hr))

        Return hr;

        固定函數(shù)流水線與可編程流水線對霧化的運(yùn)用完全不同:(1)驅(qū)動程序支持D3DPMISCCAPS_FOGANDSPECULARALPHA時(shí),如果使用固定函數(shù)流水線并對D3DRS_FOGCOLOR進(jìn)行設(shè)置,則像素渲染中的v1.w等于霧化渲染狀態(tài)中的值域;如果使用可編程流水線,盡管d1.w被顯式地寫入頂點(diǎn)渲染,但像素渲染中的v1.w仍等于0.(2)驅(qū)動程序不支持D3DPMISCCAPS_FOGANDSPECULARALPHA時(shí),如果使用固定函數(shù)流水線并對D3DRS_FOGACOLOR進(jìn)行設(shè)置,則像素渲染中的v1.w等于霧化渲染狀態(tài)中的值;如果霧化被顯式寫入頂點(diǎn)渲染,則像素渲染中的v1.w等于霧化值,且介于0~1之間;如果上述兩種情況都不適用,即使d1.w被顯式寫入頂點(diǎn)渲染,但像素渲染中的v1.w仍為0.

        1.6 頂點(diǎn)霧化

        系統(tǒng)執(zhí)行頂點(diǎn)霧化時(shí),對多邊形中每一頂點(diǎn)進(jìn)行霧化計(jì)算,在光柵化過程中再對多邊形面上的計(jì)算結(jié)果進(jìn)行插值運(yùn)算[5,6].頂點(diǎn)霧化效果由D3D光照和變換引擎來計(jì)算.

        如果應(yīng)用程序不使用D3D進(jìn)行變換和光照處理,那么應(yīng)用程序必須執(zhí)行霧化計(jì)算,在這種情況下,把在鏡面顏色中Alpha組件里計(jì)算出的霧化因子放置于每一個(gè)頂點(diǎn)中.此時(shí),用戶可以隨心所欲地使用自己想要的基于發(fā)散的、變體積的或其他的任何公式.D3D使用被提供的霧化因子在每一個(gè)多邊形的面上進(jìn)行插值計(jì)算,那些執(zhí)行自身變換和光照的應(yīng)用程序也必須進(jìn)行自己的頂點(diǎn)霧化計(jì)算.因此,如在霧化混合和霧化顏色中所敘述的,這樣的應(yīng)用程序僅需通過相關(guān)的渲染狀態(tài)使用霧化混合和設(shè)置霧化顏色即可.

        按照下列步驟可以使用應(yīng)用程序中的頂點(diǎn)霧化:

        (1)設(shè)置D3DRS_FOGENABLE為TRUE啟用霧化混合;

        (2)在渲染狀態(tài)D3DRS_FOGCOLOR中設(shè)置霧化顏色;

        (3)通過設(shè)置枚舉型D3DFOGMODE中的變量渲染狀態(tài)D3DRS_FOGVERT-EXMODE來選擇所需的霧化公式;

        (4)針對在渲染狀態(tài)中選擇的霧化公式,設(shè)置相應(yīng)的霧化參數(shù).

        下面的C++代碼示例,給出了這些步驟在程序中的具體實(shí)現(xiàn):

        Void SetupVertexFog(DWORD Color, DWORD Mode, BOOL UseRange, FLOAT Density)

        {

        Float Start=0.5f, //Linear fog distances

        End=0.8f;

        g_pDevice->SetRenderState (D3DRS_FOGENABLE,TRUE);

        }

        g_pDevice->SetRenderState (D3DRS_FOGCOLOR, Color);

        //Set the fog parameters.

        If (D3DFOG_LINEAR==Mode)

        {

        g_pDevice->SetRenderState (D3DRS_FOGVERTEXMODE,Mode);

        g_pDevice->SetRenderState (D3DRS_FOGSTART,*(DWORD*)(&Start));

        g_pDevice->SetRenderState (D3DRS_FOGEND,*(DWORD*)(&End));

        }

        else

        {

        g_pDevice->SetRenderState (D3DRS_FOGVERTEXMODE,Mode);

        g_pDevice->SetRenderState (D3DRS_FOGDENSITY,*(DWORD*)(&Density));

        }

        //Enable range-based fog if desired (only supported for vertex fog).For this

        //example,it is assumed that UseRange is set to a nonzero value only if the driver

        //exposes the D3DPRASTERCAPS_FOGRANGE capability. Note: This is slightly

        //more performance intensive than non-range-based fog.

        If (UseRange)

        g_pDevice->SetRenderState (D3DRS_RANGEFOGENABLE,TRUE);

        }

        2 基于發(fā)散的霧化

        圖2 基于發(fā)散霧化的俯視圖

        只有D3D在使用帶有D3D變換和光照引擎的頂點(diǎn)霧化時(shí),才使用基于發(fā)散的霧化計(jì)算,這是因?yàn)橄袼仂F化是在設(shè)備驅(qū)動程序中完成的.目前不存在支持基于發(fā)散的單個(gè)像素霧化硬件,如果應(yīng)用程序執(zhí)行自身的變換和光照,則它也必須執(zhí)行自身的霧化計(jì)算和基于發(fā)散的霧化計(jì)算,否則不必計(jì)算.有時(shí)候,使用霧化會產(chǎn)生圖形贗象[7,8],以致在非直覺方式下使物體和霧化顏色混為一體.例如,在一個(gè)有兩個(gè)可見物體的場景中一個(gè)在足夠遠(yuǎn)處,可通過霧化影響,另一個(gè)在足夠近處,不受霧化影響.如果視覺區(qū)域在空間旋轉(zhuǎn),即使物體是靜止的,霧化效果也會明顯發(fā)生變化.圖2給出了這種情況的俯視圖.

        3 結(jié)束語

        (1)使用頂點(diǎn)渲染時(shí),必須使用頂點(diǎn)霧化,這是通過使用頂點(diǎn)渲染將每一頂點(diǎn)的霧化強(qiáng)度寫入霧化寄存器來完成的.像素渲染完成之后,對霧化數(shù)據(jù)與霧化顏色進(jìn)行線性插值運(yùn)算.該亮度在像素渲染中是不可用的.

        (2)在基于發(fā)散的霧化中,D3D使用從觀察點(diǎn)(視點(diǎn))到頂點(diǎn)的有效距離(實(shí)際距離)進(jìn)行霧化計(jì)算,D3D會隨著兩點(diǎn)間距離的增大而增加霧化效果,而并非是增加場景中頂點(diǎn)的深度,因此避免了旋轉(zhuǎn)贗象.如果當(dāng)前設(shè)備支持基于發(fā)散的霧化,則當(dāng)調(diào)用GetDeviceCaps時(shí),它可對D3DCAPS9成員RasterCaps中的D3DPRASTERCAPS_FOGRANGE進(jìn)行設(shè)置.

        (3)使用基于發(fā)散的霧化,需將渲染狀態(tài)D3DRS_RANGEFOGNABLE設(shè)為TRUE.D3D在變換和光照過程中對基于發(fā)散的霧化進(jìn)行計(jì)算,不使用D3D變換和光照引擎的應(yīng)用程序必須執(zhí)行它們自己的頂點(diǎn)霧化計(jì)算.在這種情況下,鏡面組件中的Alpha組件為每個(gè)頂點(diǎn)提供基于發(fā)散的霧化因子.

        參考文獻(xiàn)

        [1] 普建濤.實(shí)時(shí)計(jì)算機(jī)圖形學(xué)[M],北京:北京大學(xué)出版社,2004.

        [2] 唐榮錫,汪嘉業(yè),彭群生.計(jì)算機(jī)圖形學(xué)教程[M].北京:科學(xué)出版社,1994.

        [3] 陳 卡.DirectX93D圖形程序設(shè)計(jì)[M].上海:上??茖W(xué)技術(shù)出版社,2003.

        [4] David F. Rogers著,石教英,彭群生譯.計(jì)算機(jī)圖形學(xué)的算法基礎(chǔ)[M].北京:機(jī)械工業(yè)出版社,2002.

        [5] Edward Angel.交互式計(jì)算機(jī)圖形學(xué)——自頂向下方法與OpenGL應(yīng)用(第三版 影印版)[M].北京:高等教育出版社,2003.

        [6] Richard S. Wright, Jr. Michael Sweet著,瀟湘工作室譯.OpenGL超級寶典(第二版)[M].北京:人民郵電出版社,2001.

        [7] 楊 欽,徐永安,翟紅英.計(jì)算機(jī)圖形學(xué)[M].北京:清華大學(xué)出版社,2005.

        [8] 清源計(jì)算機(jī)工作室.MATLAB6.0高級應(yīng)用——圖形圖像處理[M].北京:機(jī)械工業(yè)出版社,2001.

        猜你喜歡
        圖形學(xué)頂點(diǎn)應(yīng)用程序
        過非等腰銳角三角形頂點(diǎn)和垂心的圓的性質(zhì)及應(yīng)用(下)
        刪除Win10中自帶的應(yīng)用程序
        關(guān)于頂點(diǎn)染色的一個(gè)猜想
        突出實(shí)踐需求的GIS專業(yè)《計(jì)算機(jī)圖形學(xué)》課程優(yōu)化改革
        關(guān)閉應(yīng)用程序更新提醒
        電腦迷(2012年15期)2012-04-29 17:09:47
        第7屆國際圖象圖形學(xué)學(xué)術(shù)會議
        三星電子將開設(shè)應(yīng)用程序下載商店
        數(shù)學(xué)問答
        微軟軟件商店開始接受應(yīng)用程序
        非計(jì)算機(jī)專業(yè)計(jì)算機(jī)圖形學(xué)教學(xué)改革初探
        色视频www在线播放国产人成| 日韩女优中文字幕在线| 日本高清一区在线你懂得 | 中文字幕在线久热精品 | 国产精品 视频一区 二区三区| 无码吃奶揉捏奶头高潮视频| 女同性恋一区二区三区四区| 亚洲一区二区在线观看av| 中文字幕亚洲精品久久| 久久精品黄aa片一区二区三区| 曰本女人牲交全视频免费播放| 国产成人一区二区三中文| 久久久高清免费视频| 国产av熟女一区二区三区蜜臀| 一区二区三区日本高清| 精品久久久久久亚洲综合网| 最新高清无码专区| av无码天堂一区二区三区| 色青青女同性恋视频日本熟女| 中文字幕中文字幕777| 亚洲中国精品精华液| 人妻聚色窝窝人体www一区| 九九视频免费| 高跟丝袜一区二区三区| 中文字幕有码手机视频| 日韩精品久久中文字幕| 国产在线精品一区二区在线看 | 永久免费看免费无码视频 | 任你躁国产自任一区二区三区| 97色偷偷色噜噜狠狠爱网站97| 亚洲啊啊啊一区二区三区| 久久九九精品国产不卡一区| 亚洲av无码乱码在线观看性色| 国产色诱视频在线观看| 亚洲中文字幕av天堂| 日本一区二区三区丰满熟女| 亚洲乱码无人区卡1卡2卡3| 国产成人综合在线视频| 亚洲女同精品一区二区久久| 国产少妇露脸精品自拍网站| 人妻少妇偷人精品免费看|