專利名稱:計算機顯卡的植入式真三維立體驅(qū)動方法
技術(shù)領(lǐng)域:
本發(fā)明涉及三維可視化技術(shù)領(lǐng)域,具體涉及一種針對計算機顯卡的植入式真三維立體驅(qū) 動方法。
背景技術(shù):
隨著計算機技術(shù)的發(fā)展,真三維立體顯示與觀測已經(jīng)成為環(huán)境仿真、模擬訓(xùn)練以及規(guī) 劃設(shè)計等領(lǐng)域常用的技術(shù)手段,并逐步與電影電視、電腦游戲等結(jié)合產(chǎn)生立體電影電視和 真三維游戲而融入人們的日常生活。
立體視覺是因為人左眼及右眼所看到的相同物體有角度上的偏差,而在大腦形成視差, 從而形成真立體感。因此,在立體視覺中需要將左、右眼所看到的影像各自獨立分開,然 后通過特定的外置設(shè)備使左右眼看到不同的影像而通過大腦的生理作用形成立體視覺。傳 統(tǒng)的真三維立體顯示需要專業(yè)的設(shè)備進行立體顯示,包括支持左右緩存的顯卡和支持雙通 道顯示的立體顯示設(shè)備以及特別的編程環(huán)境與編程技術(shù)?;谏鲜黾夹g(shù)產(chǎn)生了廣為流行的 虛擬現(xiàn)實技術(shù),在機器仿真、戰(zhàn)場模擬等領(lǐng)域得到了廣泛的應(yīng)用。但是,由于需要專業(yè)設(shè) 備與編程技術(shù)成本高昂,限制了立體顯示技術(shù)的應(yīng)用,所以立體顯示的應(yīng)用不能得到推廣, 大量的三維建?;蚩梢暬浖到y(tǒng)采用透視變換技術(shù)對場景進行處理,形成單目視覺的單 通道渲染圖像,并進行顯示輸出,這種三維顯示失去了三維程序應(yīng)有的立體顯示特性和沉 浸感。由于真三維立體顯示需要專門硬件,特殊的編程環(huán)境與編程技術(shù),大量的應(yīng)用軟件 在開發(fā)時沒有考慮真三維立體顯示特性,沒有在程序中實現(xiàn)支持真三維立體顯示的功能, 使得這些軟件即使在有真三維立體顯示功能的硬件上也不能支持真三維立體顯示與觀測, 這些軟件占據(jù)了現(xiàn)有三維應(yīng)用軟件的絕大部分,包括商用CAD軟件,三維建模軟件,游戲 軟件等等。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有三維應(yīng)用軟件在真三維立體顯示與觀測中存在的問題,對基 于主流3D API (顯卡與應(yīng)用程序之間的接口)的三維軟件不加任何修改就能實現(xiàn)真三維立 體顯示與觀測。本發(fā)明的核心是利用三維渲染的基本原理,通過攔截顯卡幀緩存中顏色和 深度數(shù)據(jù),解析得到當(dāng)前場景的投影變換矩陣以及單通道渲染的關(guān)鍵參數(shù),應(yīng)用三維渲染 的基本原理以及柵格化的三維場景數(shù)據(jù),在此場景基礎(chǔ)上,應(yīng)用立體視覺原理,自適應(yīng)的
5生成立體像對,基于不同的立體顯示模式,驅(qū)動顯卡進行立體輸出。
本發(fā)明的應(yīng)用目標是所有利用3D顯示原理基于3D API實現(xiàn)單通道透視立體顯示的計 算機軟件,在不更改這些軟件的源代碼、二進制代碼或計算機硬件結(jié)構(gòu)的情況下,使該計 算機軟件實現(xiàn)雙目視覺的立體真三維顯示與觀測。
本發(fā)明依賴的技術(shù)基礎(chǔ)是計算機圖形學(xué)中關(guān)于三維渲染的基本模型,涉及三維渲染流 水線、頂點的變換流水線、Z緩沖區(qū)算法等。實現(xiàn)依據(jù)是主流的3D API和顯卡均是基于該 模型進行工作的,絕大多數(shù)三維渲染應(yīng)用軟件均是在這些3D API基礎(chǔ)上開發(fā)的。
計算機三維顯示的基本原理是將三維場景經(jīng)過幾何變換和光照處理以及柵格化之后,生 成一幅二維柵格圖像在輸出設(shè)備上輸出。三維場景中包含一系列的三維對象,三維對象是 由一系列頂點構(gòu)成的幾何圖元(包括點,線和三角形)組合而成。頂點是一個包含三維空 間位置及其對應(yīng)的渲染參數(shù)的坐標點。首先對頂點數(shù)據(jù)進行透視坐標變換和光照處理。在 坐標變換階段,描述物體幾何形狀的頂點被變換到視點為中心的坐標系下,再進行光照計 算確定每個頂點應(yīng)該具有的顏色和亮度。計算機圖形學(xué)的基本顯示單元是像素,這些幾何 對象被柵格化成像素,最后這些像素被送到幀緩存中等待顯示,如圖2所示。
在三維圖形渲染中存在著一系列的坐標變換,最后將物體本身的坐標變換成二維屏幕 上的像素坐標。這些坐標變換都是將上一步變換結(jié)果作為輸出的,構(gòu)成一個頂點坐標變換 的流水線,如圖3所示。所有三維對象的坐標均被統(tǒng)一到了同一個坐標系下,經(jīng)過投影和裁 剪形成規(guī)格化的坐標,通過柵格化變換形成圖像像素。
Z緩沖區(qū)算法又稱深度緩沖算法。由于二維平面坐標在透視投影下可以對應(yīng)無限多個三 維坐標。所以柵格化的幾何對象包含了每個像素對應(yīng)的到視點稱為深度值的參數(shù),如果柵 格化幾何對象像素的深度值小于原來像素,就用這個像素的值代替原來位置的值,這就保 證了總是距離視點最近的像素被保存下來。
針對以上原理,實現(xiàn)本發(fā)明目的的技術(shù)方案是-計算機顯卡的植入式真三維立體驅(qū)動方法,該方法包括以下步驟 步驟(1)對3D API進行監(jiān)控,在三維可視化程序與顯卡之間攔截3D API關(guān)鍵函數(shù), 獲取場景渲染數(shù)據(jù);
步驟(2)利用場景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù);
步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個不同的視點位置并生成立體像對;
步驟(4)針對不同的立體觀察設(shè)備進行真三維觀測。本發(fā)明的方法具體可用下列步驟實現(xiàn),下列步驟不分先后
a. 監(jiān)控創(chuàng)建三維顯示環(huán)境的函數(shù),在該函數(shù)中加入調(diào)用3D API的系統(tǒng)檢測函數(shù)功能, 獲取系統(tǒng)立體顯示特性,根據(jù)相應(yīng)的立體顯示特性,更改原始設(shè)定的顯示環(huán)境中的立體顯 示模式,在支持立體顯示的硬件上開啟真三維立體顯示支持,在不支持立體顯示的硬件上, 設(shè)置標志以便進行紅綠立體顯示;
b. 監(jiān)控開始一幀繪制的函數(shù),在該函數(shù)中加入代碼獲取當(dāng)前繪圖幀的視口尺寸,根據(jù)渲 染的像素格式為立體像對創(chuàng)建臨時的緩沖區(qū);
c. 監(jiān)控改變當(dāng)前繪制矩陣的函數(shù),在該函數(shù)中加入代碼以獲取三維應(yīng)用軟件對當(dāng)前繪 制矩陣的更改,通過矩陣參數(shù)識別場景渲染的投影類型,當(dāng)是透視投影時,記錄該矩陣, 作為三維場景重構(gòu)的關(guān)鍵參數(shù);
d. 監(jiān)控將幀緩存輸出到顯示設(shè)備的函數(shù),在監(jiān)控函數(shù)加入代碼以獲取整個幀中各像素 的顏色和深度數(shù)據(jù),基于步驟C獲取的投影變換矩陣信息,反算每個像素在視點坐標系下 的三維坐標,重建出基于像素的柵格化的三維場景;根據(jù)人眼睛的立體視覺模型,生成可 供立體顯示的立體像對。
所述步驟(1)中3DAPI的監(jiān)控與渲染數(shù)據(jù)攔截進一步包括利用API攔截技術(shù),獲取 三維繪制相關(guān)矩陣和三維渲染數(shù)據(jù)輸出,提取實現(xiàn)三維透視變換的投影矩陣、視口寬高, 作為三維場景重構(gòu)的關(guān)鍵參數(shù);利用3D API的特定函數(shù),攔截三維渲染輸出,提取顯卡幀 緩存中的顏色和深度數(shù)據(jù),作為三維場景重構(gòu)的基礎(chǔ)。
3D API攔截是指利用計算機編程技術(shù),對三維應(yīng)用軟件中的3D API函數(shù)調(diào)用進行監(jiān)控, 并對3D API產(chǎn)生的渲染數(shù)據(jù)進行攔截在其中插入自定義代碼,達到對原有API進行監(jiān)控或 重新實現(xiàn)的目的。API攔截技術(shù)成熟且應(yīng)用廣泛,如屏幕取詞軟件、反病毒軟件、網(wǎng)絡(luò)防火 墻等等。本發(fā)明所指的3D API渲染攔截是指攔截特定功能的若干關(guān)鍵3D API函數(shù)。
所述步驟(1)中還進一步包括針對其實現(xiàn)3D API關(guān)鍵函數(shù)的攔截的具體步驟針對 3D API,通過代碼注入或/和鉤子函數(shù)技術(shù)編寫特定的攔截程序,在三維可視化程序的數(shù)據(jù) 加載階段,將3D API攔截程序加載到三維可視函數(shù)化程序的進程中,從而攔截和監(jiān)控3D API 調(diào)用。本發(fā)明所指需要攔截的3D API關(guān)鍵函數(shù)如下
(21) 3D API創(chuàng)建三維顯示環(huán)境的函數(shù);
(22) 3D API開始一幀場景渲染的函數(shù);(24) 3D API結(jié)束一幀場景渲染的函數(shù)的;
(25) 3D API將渲染數(shù)據(jù)輸出到當(dāng)前屏幕上的函數(shù)。
所述步驟(2)進一步包括利用3DAPI輸出到顯卡幀緩存中的顏色和深度數(shù)據(jù),結(jié)合攔 截3D API調(diào)用而獲得的投影參數(shù),來解析生成顏色圖像和深度數(shù)據(jù)的三維空間信息。艮卩, 通過生成三維渲染輸出的投影矩陣和視口寬高,解算出三維渲染關(guān)鍵控制參數(shù)(視點位置、 近平面、遠平面)以及三維渲染輸出的顏色和深度數(shù)據(jù),進而解算出每個像素在視空間中 的三維坐標以及對應(yīng)的顏色特性,重構(gòu)視空間下柵格化的三維場景數(shù)據(jù)。它具體可以包含 以下步驟
I. 透視投影變換矩陣的識別。在一幀場景的渲染過程中,三維應(yīng)用軟件可能會多次更 改投影變換矩陣,只有透視變換矩陣才可以產(chǎn)生透視三維效果。不失一般性,假設(shè)3D應(yīng)用 軟件在一幀的渲染過程中保持一致,將透視投影矩陣攔截下來,將矩陣中的特征值作為判 據(jù),判斷當(dāng)前攔截的矩陣是否為透視投影矩陣。
II. 建立視點為坐標原點的三維空間坐標系(簡稱視點坐標系)。以步驟I截獲的透視投 影變換矩陣為參數(shù),建立以透視點為坐標原點的視圖坐標系Z軸穿過近平面的中心,近平 面的Y軸和X軸方向和該坐標系的X軸,Y軸方向一致,近平面位于近平面值對應(yīng)的Z軸的 刻度上。近平面上X的值域是[-width/2, width/2],Y的值域是[-height/2, height/2]。在 該坐標系中,任意坐標點P(X,Y,Z)與近平面的交點的坐標值P' (X', Y', Z')可以由透 視投影矩陣變換求得,其中Z'對應(yīng)于幀深度緩存中的深度值??傻肵'等于width/2々X/Z ; Y'等于height/2*Y/Z; Z,等于(z-zNear)/z * zFar/(zFar-zNear),其中Z'對應(yīng)于深度緩 存中的值。
ni.柵格化三維場景數(shù)據(jù)的重構(gòu)。設(shè)視口的寬度為width'、高度為height',可由3D API 相關(guān)函數(shù)獲得。由視口和近平面的比例關(guān)系可知任意三維渲染幀圖像像素點的坐標 P'' , (X''' , Y,'')對應(yīng)于近平面上的三維坐標Pn(xn , yn , zn), 其中 xn=(X,' , -width' /2)*width/2, yn=(Y, ,' -height' /2) *height/2。對應(yīng)的深度緩存中的值 Z',由步驟II可知,對應(yīng)的視點坐標系下Z值為Z' *(zFar-zNear)/zFar+zNear,可得像素 點在視點坐標系下的坐標P(X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。
通過調(diào)用3D API的讀取顯卡中顏色緩沖區(qū)函數(shù)和深度緩沖區(qū)函數(shù),利用步驟II中建 立的坐標系以及上述關(guān)系,可以獲得視點坐標系下所有像素點的三維坐標。將所有的三維坐 標用三角形面片連接起來,就構(gòu)成了一個可進行三維渲染的立體表面,該表面通過三維流
8水線,在任意視角下進行渲染。
所述步驟(3)中"設(shè)定兩個不同的視點位置并生成立體像對"是利用步驟(2)重構(gòu)的三維場景,生成兩幅影像,形成立體像對。本發(fā)明提出基于"立體像素"的三維場景的立體顯示模型,所謂立體像素是指將步驟(2)重構(gòu)的三維場景的每個像素與其對應(yīng)視點空間的三維坐標一起組成序列[(X,Y,Z), (R,G,B)],構(gòu)成的一個三維像素空間。針對該空間中的每個像素,按照透視變換原理,計算出其在新視點的像素位置點。
生成立體像對可采用下列兩種方法
方法一.調(diào)用3D API,渲染步驟(2)中獲得的場景數(shù)據(jù),在原始圖像作為左視點圖像情況下,生成右視點圖像;在原始圖像作為右視點圖像情況下,生成左視點圖像;在不保存原始圖像情況下,生成左右視點圖像,從而實現(xiàn)立體像對生成。
方法二.采用柵格化三維場景數(shù)據(jù),構(gòu)建原始視空間與目標視空間下像素的映射關(guān)系,將原始視空間下的像素直接變換到目標視空間下。在原始圖像作為左視點圖像情況下,生
成右視點圖像;在原始圖像作為右視點圖像情況下,生成左視點圖像;在不保存原始圖像
情況下,生成左右視點圖像,從而實現(xiàn)立體像對快速生成。其中
視點水平偏移,是指新視點距離原始視點在X軸方向上的改變量A 。視點垂直偏移,是指新視點距離原始視點在Z軸方向上的改變量A。圖像像素偏移,是指生成的圖像像素水平方向的附加偏移Aw。
則在另一的視點坐標系下,對原始幀圖像中點P(X,Y,Z)的像素標在左視點下的坐標X是Width' *(X-Dx)/(Z-Dz)+Dpixel, Y是Height' *Y/(Z-Dz)。該像素在對于右視點坐標系下,坐標按照上述方法計算,但Dx,Dz取負號。
將每個像素的顏色復(fù)制到目標位置。對兩個視點都應(yīng)用該方法從而獲得立體像對。該方法具有不經(jīng)過圖形流水線,程序編制簡單,優(yōu)化容易等優(yōu)點。
所述步驟(4)中"針對不同的立體觀察設(shè)備進行真三維觀測"是指將步驟(3)生成的立體像對,通過顯示設(shè)備輸出并進行立體觀察。本發(fā)明生成的立體像對通過如下方式進行真三維顯示
x.顯卡支持的雙目立體顯示。如在支持立體顯示的0penGL API環(huán)境下,在創(chuàng)建設(shè)備句柄階段啟動0penGL API的立體顯示模式,將生成的立體像對分別輸送到左右兩個緩沖區(qū)中,實現(xiàn)立體顯示。y.在不支持立體顯示的顯卡上,將立體像對合成為一幅紅綠互補色立體圖像,從左右立
體像對中的一個圖像提取紅色通道,另一個圖像中提取綠色和藍色通道,將提取的通道融合,形成一個互補色的立體圖像。并送回原始的圖像緩沖區(qū)進行立體顯示與觀測。
z.將立體圖像或像對輸送到其他支持立體顯示設(shè)備上。
(1) 本發(fā)明旨在解決現(xiàn)階段已經(jīng)大量存在的三維應(yīng)用軟件不能支持立體真三維立體
顯示的問題,依靠對3D API的攔截與監(jiān)控對三維場景渲染的關(guān)鍵參數(shù)和結(jié)果數(shù)據(jù)進行捕獲與解析。通過捕獲的投影變換矩陣,獲取反算三維場景的關(guān)鍵參數(shù),通過捕獲的渲染顏色和深度數(shù)據(jù),逐像素反求其三維坐標,并將像素值映射到對應(yīng)的位置上,形成立體像對。通過多種顯示設(shè)備進行立體顯示與觀測,在根本上解決了三維立體顯示的門檻問題。本發(fā)
明具有如下特色
(2) 解決了現(xiàn)有大量三維程序進行直接立體顯示的問題,使得大量已有的三維顯示程
序不經(jīng)過重新開發(fā)直接進行立體顯示,保護了原來的投資。
(3) 實現(xiàn)的算法新穎,通過利用生成的顏色圖像和深度圖像經(jīng)過重新分配形成立體像對,算法原理簡單,編程實現(xiàn)方便,有利于硬件直接實現(xiàn)與固化,可以擴展為顯卡的直接支持功能。
(4) 充分利用了現(xiàn)有的技術(shù)資源,由于基于工業(yè)標準的3DAP1開發(fā),具有良好的適應(yīng)性,對于顯卡沒有特殊要求。
(5) 支持多種顯示模式,可以在任意顯示環(huán)境下實現(xiàn)立體顯示。
圖1本發(fā)明實施例1的方法流程圖
圖2本發(fā)明采用的三維渲染的基本模式
圖3本發(fā)明采用的三維圖形的坐標變換流水線
圖4本發(fā)明實施例1的透視投影與透視變換矩陣
圖5本發(fā)明實施例1的以視點為中心的坐標系
圖6本發(fā)明實施例1的立體像對的快速生成方法圖
具體實施例方式
下面結(jié)合附圖和實施例對本發(fā)明做進一步詳細說明。實施例l
10目前普遍應(yīng)用的3D API有DirectX、 0penGL、 Glide、 Heidi等。如圖2和圖3所示, 本實施例采用OpenGL 3D API作為實施對象,操作系統(tǒng)平臺為Windows XP進行。針對計算 機顯卡的植入式真三維立體驅(qū)動方法基于說明書之原理,OpenGL API的攔截與監(jiān)控基于 Micorsoft Detours SDK幵發(fā)。Detours是Microsoft提供的一套Windows平臺下進行API 調(diào)用攔截的開發(fā)包,支持Win32所有應(yīng)用。
如圖1所示, 一種計算機顯卡的植入式真三維立體驅(qū)動方法,該方法包括以下步驟 步驟(1)針對三維應(yīng)用軟件使用的OpenGL API進行監(jiān)控,攔截OpenGL API關(guān)鍵函數(shù), 獲取場景渲染數(shù)據(jù);
步驟(2)利用場景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù);
步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個不同的視點位置并生成立體像對;
步驟(4)針對不同的立體觀察設(shè)備進行真三維觀測。
步驟(1)中OpenGL API的攔截與獲取場景渲染數(shù)據(jù)進一步包括利用OpenGL API攔 截技術(shù),獲取三維繪制相關(guān)矩陣和三維渲染數(shù)據(jù),提取實現(xiàn)三維透視變換的投影矩陣、視 口寬高,作為三維場景重構(gòu)的關(guān)鍵參數(shù);利用OpenGLAPI的特定函數(shù),攔截三維渲染輸出, 提取顯卡幀緩存中的顏色和深度數(shù)據(jù),作為三維場景重構(gòu)的基礎(chǔ)。
步驟(2)進一步包括利用OpenGL API輸出到顯卡幀緩存中的顏色和深度數(shù)據(jù),結(jié)合攔 截OpenGL API調(diào)用而獲得的投影參數(shù),來解析生成顏色圖像和深度數(shù)據(jù)的三維空間信息。 它進一步包含以下步驟
I.透視投影變換矩陣的識別。在一幀場景的渲染過程中,三維應(yīng)用軟件可能會多次更 改投影變換矩陣,只有透視變換矩陣才可以產(chǎn)生透視三維效果。不失一般性,假設(shè)透視投 影變換矩陣在一幀的渲染過程中保持一致。透視投影的各項控制參數(shù)與對應(yīng)的矩陣關(guān)系見 附圖4所示。將透視投影矩陣攔截下來,將矩陣中的特征值作為判據(jù),判斷當(dāng)前攔截的矩 陣是否為透視投影矩陣。
II.建立視點為坐標原點的三維空間坐標系(簡稱視點坐標系)。以步驟I截獲的透視投 影變換矩陣為參數(shù),建立以透視點為坐標原點的視圖坐標系Z軸穿過近平面的中心,近平 面的Y軸和X軸方向和該坐標系的X軸,Y軸方向一致,近平面位于近平面值對應(yīng)的Z軸的 刻度上。近平面上X的值域是[iidth/2, width/2], Y的值域是[-height/2, height/2]。在 該坐標系中,任意坐標點P(X,Y,Z)與近平面的交點的坐標值P' (X', Y', Z')可以由透 視投影矩陣變換求得,其中Z'對應(yīng)于幀深度緩存中的深度值,如附圖5所示??傻肵'等于 width/2*X/Z ; Y,等于height/2*Y/Z; Z'等于(z-zNear)/z * zFar/(zFar-zNear),其中Z'對應(yīng)于深度緩存中的值。
III.柵格化三維場景數(shù)據(jù)的重構(gòu)。設(shè)視口的寬度為width'、高度為height',可由0penGL API相關(guān)函數(shù)獲得。由視口和近平面的比例關(guān)系可知任意三維渲染幀圖像像素點的坐標 P''' (X''' , Y''')對應(yīng)于近平面上的三維坐標Pn(xn , yn , zn), 其中 xn-(X''' -width' /2)*width/2, yn=(Y,'' -height' /2) *height/2。對應(yīng)的深度緩存中的值 Z',由b可知,對應(yīng)的視點坐標系下Z值為Z' *(zFar-zNear) /zFar+zNear,可得像素點在視 點坐標系下的坐標P(X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。
通過調(diào)用OpenGL API的讀取顯卡中顏色緩沖區(qū)函數(shù)和深度緩沖區(qū)函數(shù),利用步驟II 中建立的坐標系以及上述關(guān)系,可以獲得視點坐標系下所有像素點的三維坐標。將所有的三 維坐標用三角形面片連接起來,就構(gòu)成了一個可進行三維渲染的立體表面,該表面通過三 維流水線,在任意視角下進行渲染。
步驟(3)利用步驟(2)重構(gòu)的三維場景,生成兩幅影像,形成立體像對。 生成立體像對可采用下列兩種方法
方法一.調(diào)用OpenGL,渲染步驟(2)中獲得的場景數(shù)據(jù),在原始圖像作為左視點圖像 情況下,生成右視點圖像;在原始圖像作為右視點圖像情況下,生成左視點圖像;在不保 存原始圖像情況下,生成左右視點圖像,從而實現(xiàn)立體像對生成。
方法二.采用柵格化三維場景數(shù)據(jù),構(gòu)建原始視空間與目標視空間下像素的映射關(guān)系, 將原始視空間下的像素直接變換到目標視空間下。在原始圖像作為左視點圖像情況下,生 成右視點圖像;在原始圖像作為右視點圖像情況下,生成左視點圖像;在不保存原始圖像 情況下,生成左右視點圖像,從而實現(xiàn)立體像對快速生成。其中
視點水平偏移,是指新視點距離原始視點在X軸方向上的改變量A 。
視點垂直偏移,是指新視點距離原始視點在Z軸方向上的改變量A。
圖像像素偏移,是指生成的圖像像素水平方向的附加偏移Aw。
則在另一的視點坐標系下,對原始幀圖像中點P(X,Y,Z)的像素標在左視點下的坐標X 是Width, Dx)/(Z-Dz)+D—" Y是Height' *Y/(Z-Dz)。該像素在對于右視點坐標系下, 坐標按照上述方法計算,但Dx,Dz取負號。
將每個像素的顏色復(fù)制到目標位置。對兩個視點都應(yīng)用該方法從而獲得立體像對。該 方法具有不經(jīng)過圖形流水線,程序編制簡單,優(yōu)化容易等優(yōu)點。
步驟(4)將步驟(3)生成的立體像對,通過顯示設(shè)備輸出并進行立體觀察。本發(fā)明生成 的立體像對通過如下方式進行真三維顯示x.顯卡支持的雙目立體顯示。如在支持立體顯示的OpenGL環(huán)境下,在創(chuàng)建設(shè)備句柄階 段啟動OpenGL的立體顯示模式,將生成的立體像對分別輸送到左右兩個緩沖區(qū)中,實現(xiàn)立 體顯示?;?br>
y.在不支持立體顯示的顯卡上,將立體像對合成為一幅紅綠互補色立體圖像,從左右立 體像對中的一個圖像提取紅色通道,另一個圖像中提取綠色和藍色通道,將提取的通道融 合,形成一個互補色的立體圖像。并送回原始的圖像緩沖區(qū)進行立體顯示與觀測?;?z.將立體圖像或像對輸送到其他支持立體顯示設(shè)備上。
下面的實施過程是上述方法的具體軟件編碼過程。
1. 基于Detours API,在Windows XP平臺下基于Visual Studio 2005建立0++語言的 Win32 DLL工程,命名為StereoDriver。
2. 在StereoDriver中定義一個數(shù)據(jù)結(jié)構(gòu)OpenGL—Stereo,該數(shù)據(jù)結(jié)構(gòu)包含如下內(nèi)容
(1) Windows繪圖上下文變量hDC,類型HDC;
(2) OpenGL渲染上下文變量hGLRC,類型HGLRC;
(3) 記錄當(dāng)前硬件是否支持立體顯示的變量IsStereoSu卯ort,類型bool;
(4) 記錄視口寬高的變量width, height,類型int;
(5) 緩存顏色數(shù)據(jù)的變量ColorBuffer,類型GLbyte*;
(6) 緩存深度數(shù)據(jù)的變量D印thBuffer,類型GLfloat;
(7) 記錄當(dāng)前變換矩陣模式的變量MatrixMode,類型GLMatrixMode
(8) 記錄當(dāng)前透視投影矩陣的變量Matrix,類型GLfloat[4] [4]
(9) 創(chuàng)建一個全局的鏈表gOpenGL—Stereos保存OpenGL_Stereo結(jié)構(gòu)的指針。
(10) 創(chuàng)建一個全局的OpenGL—Stereo指針ActiveOpenGL—Stereo,初始化為NULL。 (4)基于Detours API實現(xiàn)對如下函數(shù)的監(jiān)控
1) wglCreateCorvtext
wglCreateContext根據(jù)應(yīng)用程序的設(shè)置,創(chuàng)建一個相應(yīng)的OpenGL的渲染上下文。創(chuàng)建 監(jiān)控函數(shù)My一wglCreateCorrtext,在wglCreateContext中實現(xiàn)如下功能
解析wglCreateContext的參數(shù),判斷用戶程序是否使用PFD—STEREO標記啟動雙通道 立體渲染支持,如果用戶程序啟動立體渲染支持,則說明用戶程序本身支持立體渲染。
如果用戶程序沒有啟動立體渲染支持,則表明用戶程序不支持立體渲染,詢問用戶是否 啟動植入式立體支持。如果用戶選擇啟用植入是立體支持,創(chuàng)建OpenGL—Stereo結(jié)構(gòu),并保存在一個包含 OpenGLStereo結(jié)構(gòu)指針的全局列表中,并初始化。使用wglChoosePixelFormat函數(shù)和 PF—STEREO標記査詢當(dāng)前顯卡是否支持立體顯示。如果支持立體顯示則將OpenGLStereo的 IsStereoSupport設(shè)置為true,否則設(shè)置為false。
使用原始的wglCreateContext創(chuàng)建HGLRC,并在OpenGLStereo中記錄對應(yīng)的HDC禾口 HGLRC,將OpenGLStereo結(jié)構(gòu)加入到gOpenGL—Stereos中。
2) wglMakeCurrent
wglMakeCurrent在若干OpenGL渲染上下文中選擇一個做為當(dāng)前活動的, 一般在 wglMakeCurrent之后開始和結(jié)束一幀的繪制。創(chuàng)建監(jiān)控函數(shù)My—wglMakeCurrent,在 My—wglMakeCurrent中實現(xiàn)如下功能當(dāng)HDC參數(shù)和HGLRC參數(shù)不為NULL時,從 gOpenGL—Stereos中用這兩個參數(shù)査找對應(yīng)hDC和hGLRC的OpenGL—Stereo結(jié)構(gòu),并賦值給 ActiveOpenGL—Stereo變量。如果兩個參數(shù)均為NULL,則將ActiveOpenGL—Stereo賦值為 NULL。
調(diào)用原始的wglMakeCurrent 。
3) glViewport
glVie叩ort將當(dāng)前活動的OpenGL渲染上下文的視口設(shè)置到指定位置和尺寸。創(chuàng)建監(jiān)控 函數(shù)My_glViewport,在My—glViewport中實現(xiàn)如下功能
如果ActiveOpenGL—Stere不為空,則判斷新的視口寬高是否和ActiveOpenGL—Stereo中 的width, height相等。如果不相等釋放OpenGL—Stereo中原有的ColorBuffer和 D印thBuffer內(nèi)存;根據(jù)視口的寬高創(chuàng)建顏色緩存區(qū)ColorBuffer和深度緩存區(qū) D印thBuffer;記錄新的width和height。
調(diào)用原始的glViewport。
4) glMatrixMode
glMatrixMode設(shè)置當(dāng)前活動OpenGL渲染上下文的活動矩陣模型。創(chuàng)建監(jiān)控函數(shù) My_glMatrixMode,在My—glMatrixMode中實現(xiàn)如下功能
如果ActiveOpenGL_Stereo不為空,則將ActiveOpenGL一Stere的MatrixMode設(shè)置為 glMatrixMode的參數(shù)。
調(diào)用原始的glMatrixMode。
5) glLoadMatrixd, glLoadMatrixf
glLoadMatrix為活動的Opena渲染上下的當(dāng)前矩陣模式設(shè)置矩陣。創(chuàng)建監(jiān)控函數(shù)
14My一glMLoadMatrix,在My_glLoadMatrix中實現(xiàn)如下功能
如果ActiveOpenGL_Stereo不為空,且其變量MatrixMode等于GL—PROJECTION,則記錄 該函數(shù)的m變量到ActiveOpenGL—Stere的Matrix中。
調(diào)用原始的glLoadMatrix函數(shù)。 6) Sw即Buffers
該函數(shù)將0penGL渲染的一幀從顯存輸出到顯示設(shè)備上。創(chuàng)建監(jiān)控函數(shù)My—SwapBuffers, 在該函數(shù)中實現(xiàn)如下功能
如果ActiveOpenGL—Stereo不為空,調(diào)用glReadPixels函數(shù),以GL—RGB從顏色緩沖區(qū) 中讀取顏色到ActiveOpenGL—Stereo的ColorBuffer變量;調(diào)用glReadPixels函數(shù)以 GL—DEPTH—COMPONENT參數(shù),讀取深度值到ActiveOpenGL—Stereo的D印thBuffer中。
從ActiveOpenGL—Stereo的Matrix變量中獲得透視投影的近平面的寬度width,高度 height,以及近平面的zNear禾口遠平面zFax。
根據(jù)ActiveOpenGL一Stereo中記錄的視口的寬度ViewPortWidth和ViewPortHeight,創(chuàng) 建臨時的顏色緩沖區(qū),ColorBufferLeft和ColorBufferRight。
從用戶設(shè)置中獲得視點偏移D,,深度偏移Dz和像素偏移Dp^。建立一個循環(huán),對每個 ColorBuffer像素,取出對應(yīng)的像素坐標iX, iY以及顏色RGB以及對應(yīng)的D印thBuffer中的 深度值。利用本發(fā)明設(shè)計的方法,像素對應(yīng)的視點坐標系中的坐標P (X,Y,Z)。對左眼以 Dx,Dz.Dpw為參數(shù)。使用本發(fā)明設(shè)計的快速立體像對生成算法,計算P對應(yīng)的像素坐標Pun。 對右眼以-Dx. -Dz. -DpM為參數(shù).使用本發(fā)明設(shè)計的快速立體像對生成算法,計算P對應(yīng)的右像 素坐標P^t。將當(dāng)前像素的顏色分別賦值給ColorBufferLeft的P^位置,和 ColorBufferRight的P^t位置。
判斷ActiveOpenGL—Stere的IsStereoSupport是否為真。如果為真,調(diào)用glDrawPixels 分別將ColorBufferLeft和ColorBufferRight中的內(nèi)容拷貝到GL_BACK_LEFT和 GL—BACK—RIGT中。否則,將ColorBufferRight中的G, B通道賦值到ColorBufferLeft對 應(yīng)像素的G, B通道上去,形成一幅紅綠立體,將ColorBufferLeft的內(nèi)容拷貝到GL—BACK中。
調(diào)用原始的SwapBuffer。
4. 編譯StereoDriver工程,生成StereoDriver. DLL文件
5. 將StereoDriver. DLL文件通過detours SDK的withdll. Exe命令行啟動需要立體顯示的 三維渲染程序。
權(quán)利要求
1、一種計算機顯卡的植入式真三維立體驅(qū)動方法,其特征是,該方法包括以下步驟步驟(1)對3D API進行監(jiān)控,在三維可視化程序與顯卡之間攔截3D API關(guān)鍵函數(shù),獲取場景渲染數(shù)據(jù);步驟(2)利用場景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù);步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個不同的視點位置并生成立體像對;步驟(4)針對不同的立體觀察設(shè)備進行真三維觀測。
2、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述真三維立體渲染方法 進一步包括下列步驟,下列步驟不分先后a. 監(jiān)控創(chuàng)建三維顯示環(huán)境的函數(shù),在該函數(shù)中加入調(diào)用3D API的系統(tǒng)檢測函數(shù)功能, 獲取系統(tǒng)立體顯示特性,根據(jù)相應(yīng)的立體顯示特性,更改原始設(shè)定的顯示環(huán)境中的立體顯 示模式,在支持立體顯示的硬件上開啟真三維立體顯示支持,在不支持立體顯示的硬件上, 設(shè)置標志以便進行紅綠立體顯示;b. 監(jiān)控開始一幀繪制的函數(shù),在該函數(shù)中加入代碼獲取當(dāng)前繪圖幀的視口尺寸,根據(jù) 渲染的像素格式為立體像對創(chuàng)建臨時的緩沖區(qū);c. 監(jiān)控改變當(dāng)前繪制矩陣的函數(shù),在該函數(shù)中加入代碼以獲取三維應(yīng)用軟件對當(dāng)前繪 制矩陣的更改,通過矩陣參數(shù)識別場景渲染的投影類型,當(dāng)是透視投影時,記錄該矩陣, 作為三維場景重構(gòu)的關(guān)鍵參數(shù);d. 監(jiān)控將幀緩存輸出到顯示設(shè)備的函數(shù),在監(jiān)控函數(shù)加入代碼以獲取整個幀中各像素 的顏色和深度數(shù)據(jù),基于步驟c獲取的投影變換矩陣信息,反算每個像素在視點坐標系下 的三維坐標,重建出基于像素的柵格化的三維場景;根據(jù)人眼睛的立體視覺模型,生成可 供立體顯示的立體像對。
3、根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(1)中3D API 的監(jiān)控與渲染數(shù)據(jù)攔截進一步包括利用API攔截技術(shù),獲取三維繪制相關(guān)矩陣和三維渲 染數(shù)據(jù)輸出,提取實現(xiàn)三維透視變換的投影矩陣、視口寬高,作為三維場景重構(gòu)的關(guān)鍵參 數(shù);利用3D API的特定函數(shù),攔截三維渲染輸出,提取顯卡幀緩存中的顏色和深度數(shù)據(jù), 作為三維場景重構(gòu)的基礎(chǔ)。
4、根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(1)中還進一 步包括針對其實現(xiàn)3D API函數(shù)的攔截的具體步驟通過代碼注入或/和鉤子函數(shù)技術(shù)編寫特定的攔截程序,在三維可視化程序的數(shù)據(jù)加載階段,將3D API攔截程序加載到三維可 視化程序的進程中,從而攔截和監(jiān)控3D API調(diào)用。
5、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(2)進一步包 括下列步驟通過生成三維渲染輸出的投影矩陣和視口寬高,解算出三維渲染關(guān)鍵控制參 數(shù)以及三維渲染輸出的顏色和深度數(shù)據(jù),進而解算出每個像素在視空間中的三維坐標以及 對應(yīng)的顏色特性,重構(gòu)視空間下柵格化的三維場景數(shù)據(jù)。
6、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(2)進一步包 含以下步驟I. 透視投影變換矩陣的識別假設(shè)透視投影變換矩陣在一幀的渲染過程中保持一致,將透視投影矩陣攔截下來,將矩陣中的特征值作為判據(jù),判斷當(dāng)前攔截的矩陣是否為透視投影矩陣;II. 建立視點為坐標原點的三維空間坐標系以步驟I截獲的透視投影變換矩陣為參 數(shù),建立以透視點為坐標原點的視圖坐標系Z軸穿過近平面的中心,近平面的Y軸和X 軸方向和該坐標系的X軸,Y軸方向一致,近平面位于近平面值對應(yīng)的Z軸的刻度上;近平面上X的值域是[-width/2, width/2],Y的值域是[-height/2, height/2];在該坐標系中, 任意坐標點P(X,Y,Z)與近平面的交點的坐標值P' (X', Y', Z')由透視投影矩陣變換求 得,其中Z'對應(yīng)于幀深度緩存中的深度值,X'=width/2*X/Z ; Y'=height/2*Y/Z; Z、(z-zNear)/z * zFar/(zFar-zNear),其中Z'對應(yīng)于深度緩存中的值;III. 柵格化三維場景數(shù)據(jù)的重構(gòu)設(shè)視口的寬度為width'、高度為height',任意三 維渲染幀圖像像素點的坐標P''' (X''', Y''')對應(yīng)于近平面上的三維坐標Pn(xn, yn, zn), 其中xn=(X, , , -width' /2)*width/2, yn=(Y,'' -height' /2) *height/2;對應(yīng)的深度緩存中 的值Z',對應(yīng)的視點坐標系下Z=Z' *(zFar-zNear)/zFar+zNear,像素點在視點坐標系下的 坐標為P(X, Y, Z),其中X=xNear/zNear*Z, Y=yNear/zNear*Z;將所有的三維坐標用三角形 面片連接起來,就構(gòu)成了一個可進行三維渲染的立體表面。
7、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(3)中生成立體 像的方法是調(diào)用3D API,渲染所述步驟(2)中獲得的場景數(shù)據(jù),在原始圖像作為左視 點圖像情況下,生成右視點圖像;在原始圖像作為右視點圖像情況下,生成左視點圖像; 在不保存原始圖像情況下,生成左右視點圖像,從而實現(xiàn)立體像對生成。
8、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(3)中生成立體 像的方法是采用柵格化三維場景數(shù)據(jù),構(gòu)建原始視空間與目標視空間下像素的映射關(guān)系,將原始視空間下的像素直接變換到目標視空間下;在原始圖像作為左視點圖像情況下,生 成右視點圖像;在原始圖像作為右視點圖像情況下,生成左視點圖像;在不保存原始圖像 情況下,生成左右視點圖像,從而實現(xiàn)立體像對快速生成。
9、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(4)中針對不同 的顯示與觀測設(shè)備,進行立體顯示與觀測,包括x.在支持立體顯示的設(shè)備上,將立體像對分別輸出到顯卡左右兩個通道,進行立體顯示5或y.在不支持立體顯示的設(shè)備上,將立體像對中, 一個圖像提取紅色通道,另一個圖像 提取綠色和藍色通道,將提取的通道融合,形成一個互補色的立體圖像,并支持紅綠眼鏡 觀察;或z.將立體圖像或像對輸送到其他支持立體顯示設(shè)備上。
10、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述需要攔截的3DAPI關(guān)鍵函數(shù)包括(21) 3D API創(chuàng)建三維顯示環(huán)境的函數(shù);(22) 3D API開始一幀場景渲染的函數(shù);(23) 3D API改變當(dāng)前渲染矩陣的函數(shù);(24) 3D API結(jié)束一幀場景渲染的函數(shù);(25) 3D API將渲染數(shù)據(jù)輸出到當(dāng)前屏幕上的函數(shù)。
全文摘要
本發(fā)明涉及一種針對計算機顯卡的植入式真三維立體驅(qū)動方法,該方法包括在三維可視化程序到顯卡之間采用植入式的渲染數(shù)據(jù)攔截技術(shù),對原始的單通道顏色信號和深度信號、三維場景變換矩陣和投影變換矩陣進行捕獲;對這些信息進行解析,重構(gòu)柵格化的三維數(shù)據(jù);基于立體視覺原理,自適應(yīng)地將該場景重新變換到兩個不同的視點位置,形成可供立體顯示的雙目視覺立體像對,驅(qū)動顯卡對雙目立體像對進行立體輸出;利用偏振、紅綠和閃閉式眼鏡等進行真三維立體顯示與觀測。本發(fā)明可以實現(xiàn)現(xiàn)有三維可視化軟件在不改變程序和操作模式的情況下進行真三維立體化的場景展示。
文檔編號G06T15/00GK101477702SQ200910025519
公開日2009年7月8日 申請日期2009年2月6日 優(yōu)先權(quán)日2009年2月6日
發(fā)明者吳明光, 溫永寧, 盛業(yè)華, 閭國年 申請人:南京師范大學(xué)