專利名稱:一種基于WinXP系統(tǒng)的3D顯示方法
—種基于Wi nXP系統(tǒng)的3D顯不方法
技術(shù)領(lǐng)域:
本發(fā)明涉及3D顯示領(lǐng)域,具體涉及一種基于WinXP系統(tǒng)的3D顯示方法。
背景技術(shù):
在3D技術(shù)已經(jīng)趨于成熟的今天,簡單的平面3D顯示已經(jīng)越來越不能滿足人們對(duì)3D顯示的需求,由此立體顯示技術(shù)如今進(jìn)入了飛速發(fā)展階段,讓觀看者有了身臨其境的立體感。何謂立體感?立體感是由人眼的視差所引起的,由于人兩只眼睛有4-6cm的距離,因此兩眼在看同一景物所產(chǎn)生的影像是不同的,在反饋回大腦后經(jīng)過視覺中樞的處理就會(huì)產(chǎn)生立體感。如今的3D電影的立體成像技術(shù),也是靠兩部攝像機(jī)拍攝成不同的影像來模擬人兩只眼睛的。同樣的,立體顯示技術(shù)在游戲領(lǐng)域也得到了充分運(yùn)用,在游戲中立體顯示有多種解決方案,一般采用的是最直接的做法,即利用攝像機(jī)將場景渲染兩遍后得到視差圖,再配合立體設(shè)備從而達(dá)到3D游戲立體化的目的。 有鑒于此,本發(fā)明人針對(duì)現(xiàn)有技術(shù)的缺陷深入研究,并有本案產(chǎn)生。
發(fā)明內(nèi)容本發(fā)明要解決的技術(shù)問題在于提供一種基于WinXP系統(tǒng)的3D顯示方法。本發(fā)明采用以下技術(shù)方案解決上述技術(shù)問題一種基于WinXP系統(tǒng)的3D顯示方法,包括如下渲染步驟步驟1:創(chuàng)建兩張width*height左右眼紋理;步驟2 :創(chuàng)建(2*width) * (height+1)立體紋理,往立體紋理里填充立體圖片標(biāo)識(shí);步驟3 :設(shè)置左眼紋理為后備緩沖,并設(shè)置左眼投影矩陣;步驟4 :渲染至左眼后備緩沖;步驟5 :設(shè)置右眼紋理為后備緩沖,并設(shè)置右眼投影矩陣;步驟6 :渲染至右眼后備緩沖;步驟7 :分別拷貝左右眼紋理至立體紋理的左上角及右上角;步驟8 :拷貝立體紋理至后備緩沖;提交后備緩沖;渲染循環(huán)按上述步驟3至步驟8,生成3D圖。本發(fā)明的優(yōu)點(diǎn)在于能在已有3D程序基礎(chǔ)上改進(jìn),無需大量修改代碼即可實(shí)現(xiàn)立體顯示的效果。
下面參照附圖結(jié)合實(shí)施例對(duì)本發(fā)明作進(jìn)一步的描述。圖1是本發(fā)明立體渲染管線圖。圖2是本發(fā)明視差投影示意圖。圖3是本發(fā)明立體圖像合成示意圖。
圖4是本發(fā)明流程不意圖。
具體實(shí)施方式NVIDIA的3D Vision立體顯示解決方案是專門為游戲而量身定做的技術(shù),本發(fā)明采用的也是這套方案。其配置需求需要如下一臺(tái)120MHz的顯示器或投影儀,G80及以上NVIDIA顯卡,window Vista及以上系統(tǒng),3D Vision套裝(包括同步器及立體眼鏡)。其工作原理如下應(yīng)用程序提交兩張左右眼的視差圖給驅(qū)動(dòng)程序后,驅(qū)動(dòng)程序會(huì)在顯示器上輪流顯示左右眼圖,比如在1,3,5吣幀顯示左眼圖,在2,4,6吣幀顯示右眼圖,在顯示左圖時(shí),3D Vision同步器會(huì)通知立體眼鏡關(guān)閉右眼顯示,其會(huì)在右眼眼鏡上放置擋板遮擋住右眼視線以實(shí)現(xiàn)單眼觀看,同理顯示右眼圖時(shí)會(huì)遮擋住左眼,這樣每只眼睛就只會(huì)看到屬于自己這只眼睛的圖片,這樣接收到得視差圖就會(huì)產(chǎn)生成出立體感。在傳統(tǒng)的3D渲染系統(tǒng)里,利用攝像機(jī)模擬人的眼睛來觀察整個(gè)3D場景,并在場景 渲染過程中,將所有場景里的物件透視投影至近裁面,最終顯示在平面顯示器上。是以我們兩只眼睛在平面顯示器上所看到的場景內(nèi)容是完全一樣的,并未對(duì)場景物件產(chǎn)生兩眼的視差,所以雖然看到的是3D場景卻無法對(duì)場景產(chǎn)生立體感。立體渲染則是在原單眼渲染的基礎(chǔ)上,將視點(diǎn)在裁剪空間內(nèi)沿著X軸方向左右平移一定距離后來模擬兩只眼睛的距離,并分別在各自的近裁面上生成各自的圖像,由于產(chǎn)生這兩張圖的觀察位置不同,則場景內(nèi)所有物件在兩張圖上所投影的位置也不同,這樣兩眼對(duì)場景內(nèi)物件也就有了視差,也就形成了兩張視差圖,最后將視差圖提交給驅(qū)動(dòng)程序后就可以實(shí)現(xiàn)3D場景的立體顯示了。立體顯示主要分主動(dòng)式(手動(dòng)式)和被動(dòng)式(自動(dòng)式)兩種,主動(dòng)式即由應(yīng)用程序向驅(qū)動(dòng)程序提交兩張視差圖或立體圖,被動(dòng)式則是通過驅(qū)動(dòng)程序自動(dòng)完成3D場景的立體化效果。目前大多數(shù)游戲的做法都是被動(dòng)式,立體渲染管線圖如圖1所示在單通道可編程渲染管線中,頂點(diǎn)通過VS (頂點(diǎn)著色器)進(jìn)行一系列的空間變換,進(jìn)入裁剪空間后進(jìn)行光柵化,并在圖片空間進(jìn)行PS (片段著色器)計(jì)算。而在立體渲染管線中,則是通過修改VS的頁腳,以實(shí)現(xiàn)將裁剪空間變換至立體空間,即左右眼的裁剪空間,并分別執(zhí)行各自的光柵化以及PS計(jì)算,因此同時(shí)也需要兩倍的RT (渲染紋理)并產(chǎn)生雙倍的DP (繪制調(diào)用)。這里可通過NVAPI獲取并設(shè)置立體顯示的一些參數(shù),如Sepration (兩眼間距)以及Convergence (聚焦深度)。被動(dòng)式立體顯示雖然自動(dòng)完成了立體化操作,但其自動(dòng)化的操作同時(shí)也帶來了許多問題,如天空盒需做特殊處理,UI也需特別指定深度,后處理及延遲渲染需要解決逆投影,3D物件拾取問題等等。因此本發(fā)明采用可控性強(qiáng)、代碼修改量少的主動(dòng)式立體化,即手動(dòng)在代碼里將場景渲染兩遍以獲取視差圖。接下來推導(dǎo)下視差偏移量是如何計(jì)算出來的其中,Interaxial:兩眼間距,Parallax :視差,Convergence :聚焦深度,Depth :頂點(diǎn)深度,Screen :聚焦屏幕寬度,Sepration :兩眼間距比例。視差投影示意圖如圖2所示,利用三角形等比定律可得Parallax eye/Interaxial= (Depth - Convergence) /DepthParallax eye=Interaxial* (1- Convergence/Depth)
將其轉(zhuǎn)換至圖片空間中,由于Interaxial/Screen與場景無關(guān),定義其為Sepration ;Parallax image=Parallax eye/Screen=Interaxial/Screen*(1- Convergence/Depth)=Sepration*(1- Convergence/Depth)再將其轉(zhuǎn)換至裁剪空間,這就需要進(jìn)行透視除法的逆運(yùn)算,并將其由{0,1}區(qū)間轉(zhuǎn)換至{-1,1}區(qū)間,Parallax clip=Parallax image*Depth*2
=2*Sepration* (Depth-Convergence)
裁剪空間是由眼空間經(jīng)過投影變換而成,而立體裁剪空間則是眼空間通過立體投影變換而成。以DirectX (以下簡稱DX)為例,使用左手坐標(biāo)系的投影矩陣,將其改造成立體投影矩陣。ParalIax=Sepration氺Ζ—Sepration氺Convergence由線性代數(shù)的矩陣相乘法則可知
/ pll、
(x,y,z,w) X= x*pH + y*pl2 + z*pl3 + w*pl4
V pl4 J
''iOr f pll ’
pl2
x*pll + y*pl2 + z*(pl3+Sep) + w*(pl4-sSep*Con) = pi3 + Sepration
V pl4 - Sepration*Convergence ^由此可得立體投影矩陣
pll O O O Λr pllO O O Λ
O ρ22 O O1-K Oρ22 O O
ρ13 O ρ33 IZ pl3+side*SeprationO ρ33 I
V ρ14 O ρ43 IJν. pl4-side*Sepration*Convergence O ρ43 I J其中左眼Side為-1,右眼Side為+1由于DX9(winXP)的先天限制,其并不支持立體緩沖,無法使用NVAPI的立體接口,在此利用NVIDIA的一個(gè)后門來實(shí)現(xiàn)立體渲染。在NVIDIA發(fā)布3D Vision的同時(shí)還推出了一款叫3D Stereo Player的立體視頻播放軟件,由視頻軟件的原理可知,視頻文件提供的并不可能有3D信息,更不會(huì)有VS的存在,其使用的是NVIDIA為3D視頻播放而留下的一個(gè)后門,因此我們也可以加以利用,立體圖像合成示意圖如圖3所示通過將兩張視差圖合并成一張大圖,并加入立體標(biāo)識(shí),NVIDIA驅(qū)動(dòng)程序搜索到圖片的立體標(biāo)識(shí)后,就會(huì)自動(dòng)分割出視差圖,并將其合并成立體圖。因此就需要在每幀渲染時(shí)獲取到左右眼圖,并按如圖3流程進(jìn)行加工后,就能實(shí)現(xiàn)立體圖的成像了,其流程圖如圖4所示
一種基于WinXP系統(tǒng)的3D顯示方法,使用如下渲染步驟步驟1:創(chuàng)建兩張width*height左右眼紋理;步驟2 :創(chuàng)建(2*width) * (height+1)立體紋理,往立體紋理里填充立體圖片標(biāo)識(shí);步驟3 :設(shè)置左眼紋理為后備緩沖,并設(shè)置左眼投影矩陣;步驟4 :渲染至左眼后備緩沖;步驟5 :設(shè)置右眼紋理為后備緩沖,并設(shè)置右眼投影矩陣;步驟6 :渲染至右眼后備緩沖;
步驟7 :分別拷貝左右眼紋理至立體紋理的左上角及右上角;步驟8 :拷貝立體紋理至后備緩沖;提交后備緩沖;渲染循環(huán)按上述步驟3至步驟8,生成3D圖。本發(fā)明DX9方案需要在顯存中額外創(chuàng)建出2張width*height大小的視差紋理作為RT,及I張(width*2)* (height+1)大小的立體紋理,并在立體紋理的最后行像素填充立體標(biāo)識(shí),然后每幀時(shí)分別渲染場景兩遍至左右眼RT,再將左眼紋理填充至立體紋理左上角,右眼紋理填充至右上角,最后將立體紋理拷貝至后備緩沖并提交。需要說明的是在修改投影矩陣時(shí),其所有相關(guān)的聯(lián)合矩陣都必須同時(shí)修改,還包括這些聯(lián)合矩陣的逆矩陣、轉(zhuǎn)置矩陣等。在后處理和延遲渲染里,紋理坐標(biāo)是通過頂點(diǎn)坐標(biāo)空間變換后插值而來的,PS里所得到的紋理坐標(biāo)值就是已經(jīng)修改過后的,因此在屏幕空間到立體空間的逆投影轉(zhuǎn)換中,也必須加入立體參數(shù)的運(yùn)算。雖然DX9不支持NVAPI,但依舊可以使用其的Active和Deactive接口來動(dòng)態(tài)控制立體渲染模式的開關(guān)。Convergence參數(shù)決定場景的立體深度,如果場景較大而Convergence太小或者場景太小而Convergence太大,場景物件間就不會(huì)有明顯的深度差,就會(huì)讓人感覺所有場景都在一個(gè)深度上,因此需要根據(jù)場景大小而調(diào)節(jié)Convergence的值,比較適合的值是將其設(shè)置為場景最大深度的一半。由于投影矩陣不同,就有可能某些離近裁面較近的物件,由于引擎場景管理的裁切算法,產(chǎn)生一只眼睛能看而見另一只眼睛看不見的情況,這樣這個(gè)物件就不會(huì)有產(chǎn)生視差,也會(huì)破壞整個(gè)場景的立體感,因此在渲染左右眼場景的時(shí)候,所使用的裁切矩陣必須是一致的。DX9方案由于驅(qū)動(dòng)的限制,一般只支持全屏模式的立體顯示,要讓其支持窗口模式有如下幾種方法與NVIDIA官方協(xié)商將項(xiàng)目加入驅(qū)動(dòng)列表里的3D Vision應(yīng)用列表;將項(xiàng)目應(yīng)用改為3D Vision應(yīng)用列表里的應(yīng)用名,如googleearth. exe ;通過NVAPI往驅(qū)動(dòng)列表里注冊(cè)項(xiàng)目應(yīng)用。以上所述僅為本發(fā)明的較佳實(shí)施用例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換以及改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種基于WinXP系統(tǒng)的3D顯示方法,其特征在于使用如下渲染步驟步驟1:創(chuàng)建兩張width*height左右眼紋理;步驟2 :創(chuàng)建(2*width) * (height+1)立體紋理,往立體紋理里填充立體圖片標(biāo)識(shí);步驟3 :設(shè)置左眼紋理為后備緩沖,并設(shè)置左眼投影矩陣;步驟4 :渲染至左眼后備緩沖;步驟5 :設(shè)置右眼紋理為后備緩沖,并設(shè)置右眼投影矩陣;步驟6 :渲染至右眼后備緩沖;步驟7 :分別拷貝左右眼紋理至立體紋理的左上角及右上角;步驟8 :拷貝立體紋理至后備緩沖;提交后備緩沖;渲染循環(huán)按上述步驟3至步驟8,生成3D圖。
全文摘要
一種基于WinXP系統(tǒng)的3D顯示方法,修改原有3D渲染流程,將渲染的視差圖加工合并成立體圖后,提交給顯卡驅(qū)動(dòng)程序,以產(chǎn)生3D顯示效果。具體使用如下渲染步驟創(chuàng)建兩張width*height左右眼紋理;創(chuàng)建(2*width)*(height+1)立體紋理,往立體紋理里填充立體圖片標(biāo)識(shí);設(shè)置左眼紋理為后備緩沖,并設(shè)置左眼投影矩陣渲染至左眼后備緩沖;設(shè)置右眼紋理為后備緩沖,并設(shè)置右眼投影矩陣;渲染至右眼后備緩沖;分別拷貝左右眼紋理至立體紋理的左上角及右上角;拷貝立體紋理至后備緩沖;提交后備緩沖。本發(fā)明能在已有3D程序基礎(chǔ)上改進(jìn),無需大量修改代碼即可實(shí)現(xiàn)立體顯示的效果。
文檔編號(hào)H04N13/00GK103024414SQ201210519960
公開日2013年4月3日 申請(qǐng)日期2012年12月6日 優(yōu)先權(quán)日2012年12月6日
發(fā)明者林鋒, 劉德建, 陳宏展, 楊健, 高強(qiáng) 申請(qǐng)人:福建天晴數(shù)碼有限公司