㈠ 由同一物體不同角度的圖片經過復雜的演算法就可以得到他的3d立體模型,這個演算法具體是怎樣處理數據的
3D晶元的處理對象是多邊形表示的物體。用多邊形表示物體有兩個優點:首先是直接(盡管繁瑣),
多邊形表示的物體其表面的分段線性特徵除輪廓外可以通過明暗處理(shading)技術消除;其次是僅存儲多邊形頂點的幾何信息,
多邊形內部每個象素的明暗顏色計算所需的信息由這些頂點信息插值而來,這正是易於用圖形硬體支持的快速明暗處理技術。
支持多邊形繪制的圖形硬體同樣也可以繪制由雙三次曲面片表示的物體,通過對這種物體的表面進行三角剖分,
用逼近的三角形網格代替原物體的曲面表示就可以做到這一點。
當然,用多邊形表示物體也有其缺點,如增加了紋理映射和陰影生成的難度,當需要詳細表示復雜物體時所需的三角形數量將變得非常龐大。
將多邊形表示的物體顯示到計算機屏幕上,這一過程涉及物體在計算機內部的表示方式即物體的數據結構,
由物體組成的場景的組織結構,物體從場景到屏幕空間要經過的一系列變換,以及產生最終屏幕圖象要經過的一系列光柵化處理。
這些方面都涉及到特定的處理演算法,相應的演算法又有許多不同的變種。
下面僅就3D晶元涉及的圖形處理過程及相關演算法做一簡單分析介紹,這些是理解3D圖形處理及圖形硬體的基礎。
㈡ 求數字水印國內外研究現狀及發展趨勢(含文獻綜述)
文章編號:1005 - 0523(2005) 02 - 0063 - 04
數字水印及其發展研究
石紅芹,謝 昕
(華東交通大學信息工程學院,江西南昌330013)
摘要:首先對數字水印的特徵進行了分析,闡述了數字水印技術的基本原理,對目前比較流行的水印演算法進行了分類和詳細地討論,最後指出目前水印技術存在的局限並對其發展進行了展望.
關鍵詞:版權保護;數字水印;水印演算法
中圖分類號:TP391 文獻標識碼:A
1 引 言
近年來,隨著數字化技術的進步和Internet 的迅速發展,多媒體信息的交流達到了前所未有的深度和廣度,其發布形式愈加豐富了. 網路發布的形式逐漸成為一種重要的形式,伴隨而來的是多媒體數據的版權保護問題. 因此多媒體信息版權保護問題成了一項重要而緊迫的研究課題. 為了解決這一難題,近幾年國際上提出了一種新的有效的數字信息產品版權保護和數據安全維護的技術一一數字水印技術. 數字水印技術通過在原始媒體數據中嵌入秘密信息———水印來證實該數據的所有權歸屬. 水印可以是代表所有權的文字、產品或所有ID、二維圖像,視頻或音頻數據、隨機序列等. 主要應用於:媒體所有權的認定. 即辨認所有權信息,媒體合法用戶信息; 媒體的傳播跟演算法研究. 該子模塊的研究為解決網路製造產品版權保護問題奠定了基礎數字水印技術,又稱數字簽名技術,成為信息隱藏技術的一種重要研究分支,為實現有效的信息版權保護提供了一種重要的手段.
2 數字水印的基本原理
從圖像處理的角度看,嵌入水印信號可以視為在強背景下迭加一個弱信號,只要迭加的水印信號強度低於人類視覺系統( Human Visual System ,HVS) 的對比度門限,HVS 就無法感到信號的存在.對比度門限受視覺系統的空間、時間和頻率特性的影響. 因此通過對原始信號作一定的調整,有可能在不改變視覺效果的情況下嵌入一些信息,從數字通信的角度看,水印嵌入可理解為在一個寬頻信道(載體圖像) 上用擴頻通信技術傳輸一個窄帶信號(水印信號) . 盡管水印信號具有一定的能量,但分布到信道中任一頻率上的能量是難以檢測到的. 水印的解碼(檢測) 即是在有噪信道中弱信號的檢測問題.
一般來說,為了使水印能有效地應用於版權保護中,水印必須滿足如下特性:
1) 隱蔽性 水印在通常的視覺條件下應該是不可見的,水印的存在不會影響作品的視覺效果.
2) 魯棒性 水印必須很難去掉(希望不可能去掉) ,當然在理論上任何水印都可以去掉,只要對水印的嵌入過程有足夠的了解,但是如果對水印的嵌入只是部分了解的話,任何破壞或消除水印的企圖都應導致載體嚴重的降質而不可用.
3) 抗竄改性 與抗毀壞的魯棒性不同,抗竄改性是指水印一旦嵌入到載體中,攻擊者就很難改變或偽造. 魯棒性要求高的應用,通常也需要很強的抗竄改性. 在版權保護中,要達到好的抗竄改性是比較困難的.
4) 水印容量 嵌入的水印信息必須足以表示多媒體內容的創建者或所有者的標志信息,或是購買者的序列號. 這樣在發生版權糾紛時,創建者或所有者的信息用於標示數據的版權所有者,而序列號用於標示違反協議而為盜版提供多媒體數據的用戶.
5) 安全性 應確保嵌入信息的保密性和較低的誤檢測率. 水印可以是任何形式的數據,比如數值、文本、圖像等. 所有的水印都包含一個水印嵌入系統和水印恢復系統. 水印的嵌入和提取過程分別
6) 低錯誤率 即使在不受攻擊或者無信號失真的情況下,也要求不能檢測到水印(漏檢、false -negative) 以及不存在水印的情況下,檢測到水印(虛檢、false - positive) 的概率必須非常小.
3 數字水印演算法
近幾年來,數字水印技術研究取得了很大的進步,見諸於文獻的水印演算法很多,這里對一些典型的演算法進行了分析.
3. 1 空間域演算法
數字水印直接載入在原始數據上,還可以細分為如下幾種方法[1~4 ] :
1) 最低有效位方法(LSB) 這是一種典型的空間域數據隱藏演算法,L. F. Tumer 與R. G. Van Schyadel等先後利用此方法將特定的標記隱藏於數字音頻和數字圖像內. 該方法是利用原始數據的最低幾位來隱藏信息(具體取多少位,以人的聽覺或視覺系統無法察覺為原則) .LSB 方法的優點是有較大的信息隱藏量,但採用此方法實現的數字水印是很脆弱的,無法經受一些無損和有損的信息處理,而且如果確切地知道水印隱藏在幾位LSB 中,數字水印很容易被擦除或繞過.
2) Patchwork 方法及紋理塊映射編碼方法
這兩種方法都是Bender 等提出的. Patchwork 是一種基於統計的數字水印,其嵌入方法是任意選擇N 對圖像點,在增加一點亮度的同時,降低另一點的亮度值. 該演算法的隱藏性較好,並且對有損的JPEG和濾波、壓縮和扭轉等操作具有抵抗能力,但僅適用於具有大量任意紋理區域的圖像,而且不能完全自動完成.
3. 2 變換域演算法
基於變換域的技術可以嵌入大量比特數據而不會導致可察覺的缺陷,往往採用類似擴頻圖像的技術來隱藏數字水印信息. 這類技術一般基於常用的圖像變換,基於局部或是全部的變換,這些變換包括離散餘弦變換(DCT) 、小波變換(WT) 、傅氏變換(FT 或FFT) 以及哈達馬變換(Hadamard transform)等等. 其中基於分塊的DCT 是最常用的變換之一,現在所採用的靜止圖像壓縮標准JPEG也是基於分塊DCT 的. 最早的基於分塊DCT 的一種數字水印技術方案是由一個密鑰隨機地選擇圖像的一些分塊,在頻域的中頻上稍稍改變一個三元組以隱藏二進制序列信息. 選擇在中頻分量編碼是因為在高頻編碼易於被各種信號處理方法所破壞,而在低頻編碼則由於人的視覺對低頻分量很敏感,對低頻分量的改變易於被察覺. 該數字水印演算法對有損壓縮和低通濾波是穩健的. 另一種DCT 數字水印演算法[5 ]是首先把圖像分成8 ×8 的不重疊像素塊,在經過分塊DCT 變換後,即得到由DCT 系數組成的頻率塊,然後隨機選取一些頻率塊,將水印信號嵌入到由密鑰控制選擇的一些DCT 系數中. 該演算法是通過對選定的DCT 系數進行微小變換以滿足特定的關系,以此來表示一個比特的信息. 在水印信息提取時,則選取相同的DCT 系數,並根據系數之間的關系抽取比特信息. 除了上述有代表性的變換域演算法外,還有一些變換域數字水印方法,它們當中有相當一部分都是上述演算法的改進及發展,這其中有代表性的演算法是I. Podichuk 和ZengWenjun 提出的演算法[6 ] . 他們的方法是基於靜止圖像的DCT 變換或小波變換,研究視覺模型模塊返回數字水印應載入在何處及每處可承受的JND(Just Noticeable Difference ,恰好可察覺差別) 的量值(載入數字水印的強度上限) ,這種水印演算法是自適應的.
3. 3 NEC 演算法
該演算法由NEC 實驗室的Cox[5 ]等人提出,該演算法在數字水印演算法中佔有重要地位,其實現方法是,首先以密鑰為種子來產生偽隨機序列,該序列具有高斯N(0 ,1) 分布,密鑰一般由作者的標識碼和圖像的哈希值組成,其次對圖像做DCT 變換,最後用偽隨機高斯序列來調制(疊加) 該圖像除直流分量外的1 000 個最大的DCT 系數. 該演算法具有較強的魯棒性、安全性、透明性等. 由於採用特殊的密鑰,故可防止IBM 攻擊,而且該演算法還提出了增強水印魯棒性和抗攻擊演算法的重要原則,即水印信號應該嵌入源數據中對人感覺最重要的部分,這種水
印信號由獨立同分布隨機實數序列構成,且該實數序列應具有高斯分布N(0 ,1) 的特徵. 隨後Podilchuk等利用人類視覺模型又對該演算法進行了改進,從而提高了該演算法的魯棒性、透明性等.
3. 4 其他一些水印演算法
1) 近年來,利用混沌映射模型實現數字水印、保密通信等成為混沌應用研究的熱點. 特別是自從Cox 等借用通信技術中的擴頻原理將水印信號嵌入到一些DCT 變換系數或者多層分解的小波變換系數以來,人們已經提出了一些混沌數字水印方法.水印的嵌入與檢測是基於人類視覺系統(HVS) 的亮度掩蔽特性和紋理掩蔽特性,折衷水印的不可見性和魯棒性之間的矛盾. 結果表明:該方法嵌入的水印具有不可見性和魯棒性,並且這種基於密鑰的混沌水印方法更好的抗破譯性能.
2) 目前比較流行的還有一種基於盲水印檢測的DWT 演算法,該演算法首先對原始圖像進行小波變換,根據人類具有的視覺掩蔽特性對低頻分量進行一定的量化,同時可不影響視覺效果,並對作為水印的圖像進行壓縮和二值化處理,形成一維的二值序列,根據二值序列的值對上述量化後的原始信號的低頻分量進行視覺閾值范圍內允許的修改,從而實現水印的嵌入. 水印提取過程是對含有水印的圖像進行小波變換,對低頻分量同樣進行量化處理,為了增大演算法的安全性,可以對水印形成的二值0 ,1 序列在嵌入前進一步進行偽隨機序列調制,相應的在水印提取過程需要增加用偽隨機序列解調的步驟. 這樣,不知道偽隨機序列的攻擊者即使推測出水印的嵌入規律,也無法提取水印. 大大增加了水印系統的透明性和魯棒性.
4 水印技術的局限
目前水印技術的局限,為了對版權保護中使用水印的成功可能性進行評估,看能否滿足實際應用需求,就需要對水印技術有更多了解. 下面介紹數字水印方案普遍存在的一些局限:
1) 不知道能夠隱藏多少位. 盡管非常需要知道指定大小載體信息上可以隱藏多少比特的水印信息,但這個問題還沒有得到圓滿解決. 事實上,對給定尺寸的圖像或者給定時間的音頻,可以可靠隱藏信息量的上界,目前還不清楚. 對圖像水印,只能說目前使用的演算法可以隱藏幾百比特位的水印信息.
2) 還沒有真正健壯的盲圖像水印演算法. 對圖像水印,魯棒性還是個問題. 目前還沒有能夠在經過所有普通圖像處理變換後,仍能倖免的盲水印演算法. 尤其是能夠抵抗幾何處理的攻擊,被認為是很難實現的目標.
3) 所有者能去除標記. 迄今為止提出的所有盲圖像水印,實際上都是可逆的. 已知水印的准確內容、以及水印的嵌入和檢測演算法,則總能在沒有嚴重損壞資料的前提下,使水印不可讀取. 目前還不清楚這個缺點在將來還是否存在;同時在設計版權保護系統時,必須考慮如下問題:一旦水印內容已知,則有可能去除水印或者部分水印.
此外,迄今為止提出的水印演算法,其可逆性使人們提出極大的疑問,即設計能夠抗篡改的健壯公開水印技術是否可能? 事實上,如果允許任何人讀取水印,則任何人只要知道水印嵌入演算法,就可以消除水印.
5 結 論
隨著電子商務的加速發展和網路用戶的直線增長,媒體的安全要求將更加迫切,作為版權保護和安全認證的數字水印技術具有極大的商業潛力,作為一門學科交叉的新興的應用技術,它的研究涉及了不同學科研究領域的思想和理論,如數字信號處理、圖像處理、資訊理論、通信理論、密碼學、計算機科學及網路、演算法設計等技術,以及公共策略和法律等問題,是近幾年來國際學術界才興起的一個前沿研究領域,得到了迅速的發展. 但數字水印技術仍然是一個未成熟的研究領域,還有很多問題需要解決,其理論基礎依然薄弱. 隨著一些先進的信號處理技術和密碼設計思想的引進,必將日趨成熟且得到更為廣泛的發展應用.
參考文獻:
[1 ] Eepa Kunr. Dimitrios hatzinakos. Digital watermarking fortelltale tamper proofing and authentication [J ] . Proceeding of the IEEE. 1999 , 87(7) :1167~1180.
[2 ] 張春田,蘇育挺. 信息產品的版權保護技術———數字水印[J ] . 電信科學,1998 ,14(12) :15~17.
[3 ] Bender W, Gruhl D. Techniques for data hiding[J ] . IBM sys2tem journal ,1996 ,35(3~4) :313~336.
[4 ] Cox I J , Killian J ,Leighton F T. Secure spread spectrum wa2termarking for multimedia[J ] . IEEE transactions on image pro2cessing ,1997 ,6(12) :1673~1687.
[5 ] Zhao J , Koch E. Embedding robust labels into images forright protection[A] . In : Proceedings of the knowright』95conference on intellectual property rights and new technologies[C] . Vienna , Austria , 1995. 241~251.
[6 ] Podilchud C I , Zeng W. Image - adaptive watermarking usingvisual model [J ] . IEEE journal on special areas in communica2tions ,1998 ,16(4) :525~539.
㈢ 3d里catmull rom什麼意思
抗鋸齒中的瑞麗模式
㈣ R600內部的這5個ALU與傳統GPU的ALU有所不同,它們是各自獨立能夠處理任意組合的1D/2D
小號,自己去看了下資料,懂了,大家可以參考下:目錄:
第一章:第二代及以後的GPU工作流程簡介
第二章:DirectX8和DirectX9 GPU的傳統流水線
第三章:頂點和像素操作指令
第四章:傳統GPU指令的執行
第五章:統一渲染架構
第六章:G80和R600的統一渲染架構實現
第七章:G80與R600效能對比
第八章:尷尬的中端--Geforce8600簡析
前面4章 我將先簡要介紹下DirectX8/9顯卡的核心----圖形處理單元GPU的工作流程和指令處理情況
從第5章開始討論統一渲染架構、新一代DirectX10 GPU的特性,G80/Geforce8800與R600/RadeonHD2900XT的架構具體實現及其區別。最後將會對中端最受關注的Geforce8600進行相應的簡單分析。
第一章:第二代及以後的GPU工作流程簡介
簡單(而不一定絕對科學)的說:GPU主要完成對3D圖形的處理--圖形的生成渲染。
GPU的圖形(處理)流水線完成如下的工作:(並不一定是按照如下順序)
頂點處理:這階段GPU讀取描述3D圖形外觀的頂點數據並根據頂點數據確定3D圖形的形狀及位置關系,建立起3D圖形的骨架。在支持DX8和DX9規格的GPU中,這些工作由硬體實現的Vertex Shader(定點著色器)完成。
光柵化計算:顯示器實際顯示的圖像是由像素組成的,我們需要將上面生成的圖形上的點和線通過一定的演算法轉換到相應的像素點。把一個矢量圖形轉換為一系列像素點的過程就稱為光柵化。例如,一條數學表示的斜線段,最終被轉化成階梯狀的連續像素點。
紋理帖圖:頂點單元生成的多邊形只構成了3D物體的輪廓,而紋理映射(texture mapping)工作完成對多變形表面的帖圖,通俗的說,就是將多邊形的表面貼上相應的圖片,從而生成「真實」的圖形。TMU(Texture mapping unit)即是用來完成此項工作。
像素處理:這階段(在對每個像素進行光柵化處理期間)GPU完成對像素的計算和處理,從而確定每個像素的最終屬性。在支持DX8和DX9規格的GPU中,這些工作由硬體實現的Pixel Shader(像素著色器)完成。
最終輸出:由ROP(光柵化引擎)最終完成像素的輸出,1幀渲染完畢後,被送到顯存幀緩沖區。
總結:GPU的工作通俗的來說就是完成3D圖形的生成,將圖形映射到相應的像素點上,對每個像素進行計算確定最終顏色並完成輸出。
第二章:DirectX8和DirectX9 GPU的傳統流水線
前面的工作流程其實已經說明了問題。本章來總結一下,承前啟後。
傳統的GPU功能部件我們不妨將其分為頂點單元和像素流水線兩部分。
頂點單元由數個硬體實現的Vertex Shader組成。
傳統的像素流水線由幾組PSU(Pixel Shader Unit)+TMU+ROP組成。
於是,傳統的GPU由頂點單元生成多邊形,並由像素流水線負責像素渲染和輸出。
對於像素流水線需要做的說明是:雖然傳統的流水線被認為=1PSU+1TMU+1ROP,但這個比例不是恆定的,例如在RadeonX1000(不包括X1800)系列中被廣為稱道的3:1黃金架構,PSU:TMU:ROP的數量為3:1:1。一塊典型的X1900顯卡具有48個PSU,16個TMU和16個ROP。之所以採用這種設計方法,主要考慮到在當今的游戲中,像素指令數要遠遠大於紋理指令的數量。ATI憑借這個優秀的架構,成功擊敗了Geforce7,在DX9後期取得了3D效能上的領先。
總結:傳統的GPU由頂點單元生成多邊形,像素流水線渲染像素並輸出,一條像素流水線包含PSU,TMU,和ROP(有的資料中不包含ROP),比例通常為1:1:1,但不固定。
第三章:頂點和像素操作指令
GPU通過執行相應的指令來完成對頂點和像素的操作。
熟悉OpenGL或Direct3D編程的人應該知道,像素通常使用RGB三原色和alpha值共4個通道(屬性)來描述。而對於頂點,也通常使用XYZ和W 4個通道(屬性)來描述。因而,通常執行一條頂點和像素指令需要完成4次計算,我們這里成這種指令為4D矢量指令(4維)。當然,並不是所有的指令都是4D指令,在實際處理中,還會出現大量的1D標量指令以及2D,3D指令。
總結:由於定點和像素通常用4元組表示屬性,因而頂點和像素操作通常是4D矢量操作,但也存在標量操作。
第四章:傳統GPU指令的執行
傳統的GPU基於SIMD的架構。SIMD即Single Instruction Multiple Data,單指令多數據。
其實這很好理解,傳統的VS和PS中的ALU(算術邏輯單元,通常每個VS或PS中都會有一個ALU,但這不是一定的,例如G70和R5XX有兩個)都能夠在一個周期內(即同時)完成對矢量4個通道的運算。比如執行一條4D指令,PS或VS中的ALU對指令對應定點和像素的4個屬性數據都進行了相應的計算。這便是SIMD的由來。這種ALU我們暫且稱它為4D ALU。
需要注意的是,4D SIMD架構雖然很適合處理4D指令,但遇到1D指令的時候效率便會降為原來的1/4。此時ALU 3/4的資源都被閑置。為了提高PS VS執行1D 2D 3D指令時的資源利用率,DirectX9時代的GPU通常採用1D+3D或2D+2D ALU。這便是Co-issue技術。這種ALU對4D指令的計算時仍然效能與傳統的ALU相同,但當遇到1D 2D 3D指令時效率則會高不少,例如如下指令:
ADD R0.xyz , R0,R1 //此指令是將R0,R1矢量的x,y,z值相加 結果賦值給R0
ADD R3.x , R2,R3 //此指令是將R2 R3矢量的w值相加 結果賦值給R3
對於傳統的4D ALU,顯然需要兩個周期才能完成,第一個周期ALU利用率75% ,第二個周期利用率25%。而對於1D+3D的ALU,這兩條指令可以融合為一條4D指令,因而只需要一個周期便可以完成,ALU利用率100%。
但當然,即使採用co-issue,ALU利用率也不可能總達到100%,這涉及到指令並行的相關性等問題,而且,更直觀的,上述兩條指令顯然不能被2D+2D ALU一周期完成,而且同樣,兩條2D指令也不能被1D+3D ALU一周期完成。傳統GPU在對非4D指令的處理顯然不是很靈活。
總結:傳統的GPU中定點和像素處理分別由VS和PS來完成,每個VS PS單元中通常有一個4D ALU,可以在一個周期完成4D矢量操作,但這種ALU對1D 2D 3D操作效率低下,為了彌補,DX9顯卡中ALU常被設置為1D+3D 2D+2D等形式。
第五章:統一渲染架構
相對於DirectX 9來說,最新的DirectX 10最大的改進在於提出了統一渲染架構,即Unified Shader。
傳統的顯卡GPU一直採用分離式架構,頂點處理和像素處理分別由Vertex Shader和Pixel Shader來完成,於是,當GPU核心設計完成時,PS和VS的數量便確定下來了。但是不同的游戲對於兩者處理量需求是不同的,這種固定比例的PS VS設計顯然不夠靈活,為了解決這個問題,DirectX10規范中提出了了統一渲染架構。
不論是頂點數據還是像素數據,他們在計算上都有很多共同點,例如通常情況下,他們都是4D矢量,而且在ALU中的計算都是沒有分別的浮點運算。這些為統一渲染的實現提供了可能。
在統一渲染架構中,PS單元和VS單元都被通用的US單元所取代,nVidia的實現中稱其為streaming processer,即流處理器,這種US單元既可以處理頂點數據,又可以處理像素數據,因而GPU可以根據實際處理需求進行靈活的分配,這樣便有效避免了傳統分離式架構中VS和PS工作量不均的情況。
總結:統一渲染架構使用US(通常為SP)單元取代了傳統的固定數目的VS和PS單元,US既可以完成頂點操作,又可以完成像素操作,因而可以根據游戲需要靈活分配,從而提高了資源利用率。
第六章:G80和R600的統一渲染架構實現
以下我們著重討論G80和R600的統一著色單元而不考慮紋理單元,ROP等因素。
G80 GPU中安排了16組共128個統一標量著色器,被叫做stream processors,後面我們將其簡稱為SP。每個SP都包含有一個全功能的1D ALU。該ALU可以在一周期內完成乘加操作(MADD)。
也許有人已經注意到了,在前面傳統GPU中VS和PS的ALU都是4D的,但在這里,每個SP中的ALU都是1D標量ALU。沒錯,這就是很多資料中提及的MIMD(多指令多數據)架構,G80走的是徹底的標量化路線,將ALU拆分為了最基本的1D 標量ALU,並實現了128個1D標量SP,於是,傳統GPU中一個周期完成的4D矢量操作,在這種標量SP中需4個周期才能完成,或者說,1個4D操作需要4個SP並行處理完成。
這種實現的最大好處是靈活,不論是1D,2D,3D,4D指令,G80得便宜其全部將其拆成1D指令來處理。指令其實與矢量運算拆分一樣。
例如一個4D矢量指令 ADD R0.xyzw , R0,R1 R0與R1矢量相加,結果賦R0
G80的編譯器會將其拆分為4個1D標量運算指令並將其分派給4個SP:
ADD R0.x , R0,R1
ADD R0.y , R0,R1
ADD R0.z , R0,R1
ADD R0.w, R0,R1
綜上:G80的架構可以用128X1D來描述。
R600的實現方式則與G80有很大的不同,它仍然採用SIMD架構。
在R600的核心裡,共設計了4組共64個流處理器,但每個處理器中擁有1個5D ALU,其實更加准確地說,應該是5個1D ALU。因為每個流處理器中的ALU可以任意以1+1+1+1+1或1+4或2+3等方式搭配(以往的GPU往往只能是1D+3D或2D+2D)。ATI將這些ALU稱作streaming processing unit,因而,ATI宣稱R600擁有320個SPU。
我們考慮R600的每個流處理器,它每個周期只能執行一條指令,但是流處理器中卻擁有5個1D ALU。ATI為了提高ALU利用率,採用了VLIW體系(Very Large Instruction Word)設計。將多個短指令合並成為一組長的指令交給流處理器去執行。例如,R600可以5條1D指令合並為一組5DVLIW指令。
對於下述指令:
ADD R0.xyz , R0,R1 //3D
ADD R4.x , R4,R5 //1D
ADD R2.x , R2,R3 //1D
R600也可以將其集成為一條VL
㈤ 3ds max和虛擬現實技術
摘要:3D Studio MAX 是Autodesk公司的子公司Kinetix推出的一種優秀的三維動畫造型軟體,它廣泛用於游戲、廣告、建築等領域,是目前PC上最流行的三維動畫造型軟體。虛擬現實技術是計算機技術發展到一定階段的產物,它使計算機適應人而不是人適應計算機,它的發展應用日益廣泛、普及。本文擬就3DS MAX 在虛擬現實系統構建過程中的應用做一介紹。
1.虛擬現實簡介
虛擬現實(VR)是一種由計算機和電子技術創造的新世界,是一個看似真實的模擬環境,通過多種感測設備用戶可根據自身的感覺,使用人的自然技能對虛擬世界的物體進行考察或操作,參與其中的事件;同時提供視覺、聽覺、觸覺等多通道的信息,用戶通過視、聽、摸等直觀而又自然的實時感知,並使參與者沉浸於模擬環境中。VR的三個最突出的特徵,即它的3「I」特性:交互性(interactivity)、沉浸感(Illusion of Immersion)、想像( imagination)。
虛擬現實技術是在眾多相關技術如計算機圖形學、模擬技術、多媒體技術、感測器技術、人工智慧的基礎上發展起來的。虛擬現實技術在最近十年裡獲得了極大的發展,這主要歸因於計算機軟、硬體條件的飛速發展,以及虛擬現實專用設備價格的下降和性能的提高。目前虛擬現實技術已經獲得了廣泛的應用,而且日益普及,不僅在諸如NASA的大型工程得到應用,也出現在一些游戲中,在一些高檔的PC機上甚至可以構建自己的個人PCVRS(個人虛擬現實系統)。
設計一個虛擬現實系統除了硬體條件一般個人無法定製外,能夠充分發揮個人能動性的就只能是在系統軟的方面下功夫了。設計一個VR系統,首要的問題是創造一個虛擬環境,這個虛擬環境包括三維模型、三維聲音等,在這些要素中,因為在人的感覺中,視覺攝取的信息量最大,反應亦最為靈敏,所以創造一個逼真而又合理的模型,並且能夠實時動態地顯示是最重要的。虛擬現實系統構建的很大一部分工作也是建造逼真合適的三維模型。
2.3D Studio MAX 簡介
3D Studio MAX是Kinetix公司推出的一套強大的三維建模軟體,由於它是基於Win NT 或Win98平台的,方便易學,又因其相對低廉的價格優勢,所以成為目前個人PC上最為流行的三維建模軟體。其3.0版本的推出,更是鞏固了它在個人PC平台上的地位。它的3.0版本相較以前的版本有了明顯的改進,具體表現在以下幾個方面:
⑴ 工作流模式使得工作組的協調更容易,效率更高。3D Studio MAX R3引入了工作流模式,在具體的實現上從外部參考體系(XRef)、示意視圖(Schematic View)的引入以及現在3D MAX 可以使用其他程序從外部加以控制,而不必激活它的工作界面。
⑵ 易用性的改進。操作界面的改進是Release 3.0版本的最顯著的變化,除了外觀的變化之外,R3.0版本還增加了諸如用戶自定義界面、宏記錄、插件代碼、變換Gizmo、軌跡條等功能。
⑶ 渲染的改進。Autodesk公司在收購了以渲染和視頻技術聞名的Discreet Logic公司,吸收了該公司的先進技術,3D MAX R3 對其渲染器幾乎做了重新設計,不僅增加了渲染的速度,而且提高了畫面渲染的質量。
⑷ 建模技術的增強。建模技術的增強是3D Studio MAX最重要、最突出的改進,這也是在虛擬現實系統構建中應用它的一個有力的原因。主要的改進包括:
① 細分曲面技術(Subdivision Surface) 。3DS MAX 包含了細分曲面技術,細分曲面技術是1998年以來業界最流行的建模技術,大有趕超NURBS技術之勢,它可以使模型建立更容易,而且效果更好。
② 柔性選擇。此項技術可以「部分地」選擇頂點,從而在變換頂點時獲得光滑、柔和的效果,這對建立復雜物體的模型時非常有用。
③ 曲面工具和改進的NURBS技術。使用曲面工具可以產生很復雜的「面片」模型,這亦是一種重要的建模方法,Release 3.0版本中的NURBS技術不但速度加快,而且增加了一系列方便、易用的功能。
⑸ 對游戲的更好支持。3D Studio MAX R3大大增強了對游戲的支持,而且這些特性也可以用於其他場合。
① 增加了角色動畫功能。Release 3.0版本內置了製作角色動畫的功能,可以方便製作人物或動物的動作、柔軟物體的效果以及變形效果。
② 頂點信息以及加強的貼圖坐標功能。現在可以對頂點著色,並增加了頂點的通道,增強了UVW Unwarp的功能,並增加了World XYZ貼圖坐標。
此外,3D Studio MAX R3也顯著增強了動畫功能。
3. 3DS MAX 在VR系統構建過程中的應用
如前所述,VR系統要求實時動態逼真地模擬環境,考慮到硬體的限制和虛擬現實系統的實時性的要求,VR系統的建模與以造型為主的動畫建模方法有著顯著的不同,VR的建模大都採用模型分割、紋理映射等技術。目前VR中的虛擬場景的構造主要有以下途徑:基於模型的方法和IBR(基於圖像的繪制)方法兩種。這兩種方法都可以在3DS MAX中加以實現和驗證,下面具體展開加以說明。
3. 1 基於模型的構造方法。3DS MAX的幾何建模方法主要有多邊形(Polygon)建模、非均勻有理B樣條曲線建模(NURBS)、細分曲面技術建模(Subdivision Surface)。通常建立一個模型可以分別通過幾種方法得到,但有優劣、繁簡之分。
⑴ 多邊形建模。多邊形建模技術是最早採用的一種建模技術,它的思想很簡單,就是用小平面來模擬曲面,從而製作出各種形狀的三維物體,小平面可以是三角形、矩形或其他多邊形但實際中多是三角形或矩形。使用多邊形建模可以通過直接創建基本的幾何體,再根據要求採用修改器調整物體形狀或通過使用放樣、曲面片造型、組合物體來製作虛擬現實作品。多邊形建模的主要優點是簡單、方便和快速但它難於生成光滑的曲面,故而多邊形建模技術適合於構造具有規則形狀的物體,如大部分的人造物體,同時可根據虛擬現實系統的要求,僅僅通過調整所建立模型的參數就可以獲得不同解析度的模型,以適應虛擬場景實時顯示的需要。
⑵ NURBS建模。NURBS是Non-Uniform Rational B-Splines(非均勻有理B樣條曲線)的縮寫,它純粹是計算機圖形學的一個數學概念。NURBS建模技術是最近4年來三維動畫最主要的建模方法之一,特別適合於創建光滑的、復雜的模型,而且在應用的廣泛性和模型的細節逼真性方面具有其他技術無可比擬的優勢。但由於NURBS建模必須使用曲面片作為其基本的建模單元,所以它也有以下局限性:NURBS曲面只有有限的幾種拓撲結構,導致它很難製作拓撲結構很復雜的物體(例如帶空洞的物體);NURBS曲面片的基本結構是網格狀的,若模型比較復雜,會導致控制點急劇增加而難於控制;構造復雜模型時經常需要裁剪曲面,但大量裁剪容易導致計算錯誤;NURBS技術很難構造「帶有分枝的」物體
⑶ 細分曲面技術。細分曲面技術是1998年才引入的三維建模方法,它解決了NURBS技術在建立曲面時面臨的困難,它使用任意多面體作為控制網格,然後自動根據控制網格來生成平滑的曲面。細分曲面技術的網格可以是任意形狀,因而可以很容易地構造出各種拓撲結構,並始終保持整個曲面的光滑性。細分曲面技術的另一個重要特點是「細分」,就是只在物體的局部增加細節,而不必增加整個物體的復雜程度,同時還能維持增加了細節的物體的光滑性。但由於細分曲面技術是一種剛出現不久的技術,3D Studio MAX R3對它的支持還顯得稚嫩,還不能完成一些十分復雜的模型創作。
有了以上3DS MAX幾種建模方法的認識,就可以在為虛擬現實系統製作相應模型前,根據虛擬現實系統的要求選取合適的建模途徑,多快好省地完成虛擬現實的作品的製作。
在虛擬現實作品製作的時候應當遵循一個原則:在能夠保證視覺效果的前提下,盡量採用比較簡單的模型,而且若能夠用參數化方法構建的對象盡量用參數化方法構建,同時,在模型創作過程中,對模型進行分割,分別建模,以利於在虛擬現實系統中進行操作和考察。
對於復雜對象的運動或原理演示,我們可以預先將對象的運動和說明做成動畫存為avi文件,然後等待VR系統合適的觸發事件,播放該avi文件即可。
3.2 基於圖像的繪制 (IBR),傳統圖形繪制技術均是面向景物幾何而設計的,因而繪制過程涉及到復雜的建模、消隱和光亮度計算。盡管通過可見性預計算技術及場景幾何簡化技術可大大減少需處理景物的面片數目,但對高度復雜的場景,現有的計算機硬體仍無法實時繪制簡化後的場景幾何。因而我們面臨的一個重要問題是如何在具有普通計算能力的計算機上實現真實感圖形的實時繪制。IBR技術就是為實現這一目標而設計的一種全新的圖形繪制方式。該技術基於一些預先生成的圖像(或環境映照)來生成不同視點的場景畫面,與傳統繪制技術相比,它有著鮮明的特點:
⑴ 圖形繪制獨立於場景復雜性,僅與所要生成畫面的解析度有關。
⑵ 預先存儲的圖像(或環境映照)既可以是計算機合成的,亦可以是實際拍攝的畫面,而且兩者可以混合使用。
⑶ 該繪制技術對計算資源的要求不高,因而可以在普通工作站和個人計算機上實現復雜場景的實時顯示。
由於每一幀場景畫面都只描述了給定視點沿某一特定視線方向觀察場景的結果,並不是從圖像中恢復幾何或光學景象模型,為了擺脫單幀畫面視域的局限性,我們可在一給定視點處拍攝或通過計算得到其沿所有方向的圖像,並將它們拼接成一張全景圖像。為使用戶能在場景中漫遊,我們需要建立場景在不同位置處的全景圖,繼而通過視圖插值或變形來獲得臨近視點的對應的視圖。IBR技術是新興的研究領域,它將改變人們對計算機圖形學的傳統認識,從而使計算機圖形學獲得更加廣泛的應用。
3DS MAX在IBR中的應用是自然的,3DS MAX的出色的紋理貼圖,強大的貼圖控制能力,各種空間扭曲和變形,都提供了對圖像和環境映照的容易的處理途徑。例如,在各種IBR的應用中,全景圖的生成是經常需要解決的問題,這方面,利用3DS MAX可以根據所需的全景圖類型先生成對應的基板,比如,柱面全景圖就先生成一個圓柱,然後控制各個方向的條狀圖像沿著圓柱面進行貼圖即可。而且可以將圖像拼接的過程編製成Script文件做成插件嵌入3DS MAX環境中,可以容易地生成全景圖並且預先觀察在虛擬現實系統中漫遊的效果,這通過在Video Post設置攝像機的運動軌跡即可。事實上,目前已經有一些全景圖生成和校正的插件。
在用3DS MAX為VR系統創作好模型後,結合VR系統的要求,看是否需要採用諸如LOD(Level of Detail)模型,如果需要可利用MAX 自帶的LOD插件直接生成對象的LOD模型,最後根據VR系統的編輯環境將模型輸出為編輯環境所能接收的文件類型,如VRML97或DXF 等格式的文件。
以上主要介紹了3DS MAX製作VR作品,下面再簡單介紹一些3DS MAX 的另外的應用。
在VR系統中經常需要有視差和景深的立體視圖,這可以通過在3DS MAX中設置雙攝像機來模擬人的雙眼來渲染立體視圖對,這個需要調整雙攝像機的相對位置,然後分別渲染不同的攝像機視圖即可得到立體視圖對,具體實現過程可參見文獻〖2〗。
3DS MAX 是用C++語言和Open GL編寫的應用軟體,而且它提供的MAX SDK也是採用C++編寫的代碼,我們可以很容易地用C++和Open GL結合MAX SDK實現我們的圖形學演算法,再把我們的演算法作為插件嵌入3DS MAX環境中,而不用考慮物體模型的生成和處理的復雜代碼,利用3DS MAX的渲染計時器可以方便地檢驗我們所編演算法的效率和效果。
參考文獻
1. 曾芬芳主編.虛擬現實技術.上海交通大學出版社, 1997年第一版.
2. 黃心淵編著.虛擬現實技術與應用.科學出版社,1999年第一版.
3. Heung-Yeung Shum and Li-Wee He . Rendering with Concentric Mosaics.SIGGRAPH』99.
4. 張昀、徐自亮. 3D Studio MAX R3(上冊).清華大學出版社,1999年第一版.
4. 3D Studio MAX R3 技術文檔. Kinetix Company.
5. 鮑虎軍,彭群生.浙江大學CAD&CG國家重點實驗室.基於圖像的圖形繪制技術. 1998 第36期 技術專題版專題報道.
㈥ OPENGL是什麼
OpenGL三維圖形標準是由AT&T公司UNIX軟體實驗室、IBM
、DEC、SUN、HP、Microsoft和SGI等多家公司在GL圖形庫標準的基礎
上聯合推出的開放式圖形庫,它使在微機上實現三維真實
感圖形的生成與顯示成為可能。由於OpenGL是開放的圖形標
准,用戶原先在UNIX下開發的OpenGL圖形軟體很容易移植到微
機上的WindowsNT/95上。筆者在VisualC++4.1(以下簡稱VC)集
成環境下,開發了基於OpenGL的三維真實感圖形應用程序,現
介紹如下。
微機上的OpenGL開發環境
基於OpenGL標准開發的應用程序必須運行於32位Windows
平台下,如WindowsNT或Windows95環境;而且運行時還需有動態
鏈接庫OpenGL32.DLL、Glu32.DLL,這兩個文件在安裝WindowsNT時已
自動裝載到C:\WINNT\SYSTEM32目錄下(這里假定用戶將WindowsNT
安裝在C盤上);而對於使用Windows95平台的用戶,則需手工將
兩個動態庫復制到Windows95目錄的SYSTEM子目錄中。安裝了
WindowsNT/95和VC4.1後,用戶就具備了基於OpenGL開發三維圖
形軟體的基本條件。
OpenGL程序設計的基本步驟
1.OpenGL在WindowsNT下的運行機制
OpenGL工作在客戶機/伺服器模式下,當客戶方(即基
於OpenGL標准開發的應用程序)向伺服器(OpenGL核心機制)發出
命令時,由伺服器負責解釋這些命令。通常情況下,客戶方
和伺服器是運行在同一台微機上的。由於OpenGL的運行機制
是客戶機/伺服器模式,這使得用戶能夠十分方便地在網
絡環境下使用OpenGL,OpenGL在WindowsNT上的這種實現方式通常
稱為網路透明性。
OpenGL的圖形庫函數封裝在動態鏈接庫OpenGL32.DLL中,
客戶機中的所有OpenGL函數調用,都被傳送到伺服器上,由
WinSrv.DLL實現功能,再將經過處理的指令發送到Win32設備驅
動介面(DDI),從而實現在計算機屏幕上產生圖像。
若使用OpenGL圖形加速卡,則上述機制中將添加兩個
驅動器:OpenGL可裝載客戶模塊(OpenGLICD)將安裝在客戶端;硬
件指定DDI將安裝在伺服器端,與WinDDI同一級別。
2.OpenGL的庫函數
開發基於OpenGL的應用程序,必須先了解OpenGL的庫函
數。OpenGL函數命令方式十分有規律,每個庫函數均有前綴gl
、glu、aux,分別表示該函數屬於OpenGL基本庫、實用庫或輔助
庫。WindowsNT下的OpenGL包含了100多個核心函數,均以gl作為前
綴,同時還支持另外四類函數:
OpenGL實用庫函數:43個,以glu作為前綴;
OpenGL輔助庫函數:31個,以aux作為前綴;
Windows專用庫函數(WGL):6個,以wgl作為前綴;
Win32API函數(WGL):5個,無前綴。
OpenGL的115個核心函數提供了最基本的功能,可以實
現三維建模、建立光照模型、反走樣、紋理映射等;OpenGL實
用庫函數在核心函數的上一層,這類函數提供了簡單的調
用方法,其實質是調用核心函數,目的是減輕開發者的編程
工作量;OpenGL輔助庫函數是一些特殊的函數,可以供初學者
熟悉OpenGL的編程機制,然而使用輔助庫函數的應用程序只
能在Win32環境中使用,可移植性較差,所以開發者應盡量避
免使用輔助庫函數;Windows專用庫函數(WGL)主要針對WindowsNT
/95環境的OpenGL函數調用;Win32API函數用於處理像素存儲格
式、雙緩存等函數調用。
3.VC環境下基於OpenGL的編程步驟
下面介紹在VC環境中建立基於Opeetting菜單選項,在Link欄的Lib輸入域中
添加openg132.lib、glu32.lib,若需使用OpenGL的輔助庫函數,則還
需添加glaux.lib。
(3)選擇View/ClassWizard菜單選項,打開MFC對話框,在
ClassName欄中選擇CMyTestView類,進行以下操作:
選擇WM_CREATE消息,滑鼠單擊EditCode,將OpenGL初始化代碼
添加到OnCreate()函數中:
/*定義像素存儲格式*/
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,0,0,0,0,0,0
32,
0,0,
PFD_MAIN_PLANE,
0,
0,0,0,
}
CCLientdc(this);
intpixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);
BOOLsuccess=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);
m_hRC=wglCreateContext(dc.m_hDC);
選擇WM_DESTORY消息,在OnDestory()中添加以下代碼:
wglDeleteContext(m_hRC);
在MyTestView.cpp中,將以下代碼添加到PreCreateWindows()函數中:
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
OpenGL只對WS_CLIPCHILDREN|WS_CLIPSIBLINGS類型窗口有效;
在MyTestView.cpp中,將以下代碼添加到OnDraw()函數中:
wglMakeCurrent(pDC->m_hDC,m_hRC);
DrawScene();//用戶自定義函數,用於繪制三維場景;
wglMakeCurrent(pDC->m_hDC,NULL);
在MyTestView.cpp中,添加成員函數DrawScene():
voidCMyTestView::DrawScene()
{/*繪制三維場景*/}
(4)在MyTestView.h中包含以下頭文件並添加類成員說明:
#include
#include
#include
在CTestView類中的protected:段中添加成員變數聲明:
HGLRCm_hRC;
同時添加成員函數聲明:
DrawScene();
這樣,一個基於OpenGL標準的程序框架已經構造好,用
戶只需在DrawScene()函數中添加程序代碼即可。
建立三維實體模型
三維實體建模是整個圖形學的基礎,要生成高逼真
度的圖像,首先要生成高質量的三維實體模型。
OpenGL中提供了十幾個生成三維實體模型的輔助庫函
數,這些函數均以aux作為函數名的前綴。簡單的模型,如球
體、立方體、圓柱等可以使用這些輔助函數來實現,如
auxWireSphere(GLdoubleradius)(繪制一半徑為radius的網狀球體)。
但是這些函數難以滿足建立復雜三維實體的需要,所以用
戶可以通過其它建模工具(如3DS等)來輔助建立三維實體模
型資料庫。筆者在三維實體的建模過程中採用3DS提供的2D
Shape、3DLofter和3DEditor進行模型的編輯,最後通過將模型數
據以DXF文件格式輸出存儲供應用程序使用。
真實感圖形的繪制
1.定義光照模型和材質
(1)光源。OpenGL提供了一系列建立光照模型的庫函
數,使用戶可以十分方便地在三維場景中建立所需的光照
模型。OpenGL中的光照模型由環境光(AmbientLight)、漫射光
(DiffuseLight)、鏡面反射光(SpecularLight)等組成,同時還可設
置光線衰減因子來模擬真實的光源效果。
例如,定義一個黃色光源如下:
GlfloatLight_position[]={1.0,1.0,1.0,0.0,};
GlfloatLight_diffuse[]={1.0,1.0,0.0,1.0,};
glLightfv(GL_LIGHT0,GL_POSTTION,light_position);//定義光源位置
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//定義光源漫射光
光源必須經過啟動後才會影響三維場景中的實體,可以通過以下指令使光源有效:<
glEnable(LIGHTING);//啟動光照模型;
glEnable(GL_LIGHT0);//使光源GL_LIGHT0有效;
OpenGL中一共可以定義GL_LIGHT0~GL_LIGHT7八個光源。
(2)材質。OpenGL中的材質是指構成三維實體的材料在
光照模型中對於紅、綠、藍三原色的反射率。與光源的定義
類似,材質的定義分為環境、漫射、鏡面反射成分,另外還
有鏡面高光指數、輻射成分等。通過對三維實體的材質定義
可以大大提高應用程序所繪制的三維場景的逼真程度。例
如:
/*設置材質的反射成分*/
GLfloatmat_ambient[]={0.8,0.8,0.8,1.0};
GLfloatmat_diffuse[]={0.8,0.0,0.8,1.0};/*紫色*/
GLfloatmat_specular[]={1.0,0.0,1.0,1.0};/*鏡面高光亮紫色*/
GLfloatmat_shiness[]={100.0};/*高光指數*/
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);/*定義環境光反射率*/
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);/*定義漫射光反射率*/
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);/*定義鏡面光反射率*/
glMaterialfv(GL_FRONT,GL_SHINESS,mat_shiness);/*定義高光指數*/
(3)材質RGB值與光源RGB值的關系。OpenGL中材質的顏色
與光照模型中光源的顏色含義略有不同。對於光源,R、G、B
值表示三原色在光源中所佔有的比率;而對於材質定義,R、
G、B的值表示具有這種材質屬性的物體對於三原色的反射
比率,場景中物體所呈現的顏色與光照模型、材質定義都相
關。例如,若定義的光源顏色是(Lr,Lg,Lb)=(1.0,1.0,1.0)(白光),
物體的材質顏色定義為(Mr,Mg,Mb)=(0.0,0.0,0.8),則最終到達人
眼的物體顏色應當是(Lr*Mr,Lg*Mg,Lb*Mb)=(0.0,0.0,0.8)(藍色)。
2.讀取三維模型數據
為了繪制三維實體,我們首先必須將預先生成的三
維實體模型從三維實體模型庫中讀出。下圖描述了讀取三
維實體模型的流程。
3.三維實體繪制
由於3DS的DXF文件中對於三維實體的描述是採用三角
形面片逼近的方法,而在OpenGL函數庫中,提供了繪制三角形
面片的方法,所以為三維實體的繪制提供了方便。以下提供
了繪制三角形面片的方法:
glBegin(TRANGLES);//定義三角形繪制開始
glVertexf((GLfloat)x1,(GLfloat)y1,(GLfloat)z1);//第一個頂點
glVertexf((GLfloat)x2,(GLfloat)y2,(GLfloat)z2);//第二個頂點
glVertexf((GLfloat)x3,(GLfloat)y3,(GLfloat)z3);//第三個頂點
glEnd();//繪制結束
為了提高三維實時動畫的顯示速度,我們利用了
OpenGL庫中的顯示列表(DisplayList)的功能,將三維場景中的實
體分別定義為單獨的顯示列表,預先生成三維實體。在圖形
顯示時,只需調用所需的顯示列表即可顯示相應的三維實
體,而不需要重新計算實體在場景中的坐標,避免了大量的
浮點運算。在調用顯示列表前所作的旋轉、平移、光照、材
質的設定都將影響顯示列表中的三維實體的顯示效果。具
體實現演算法如下:
for(ObjectNo=0;ObjectNo<實體個數;ObjectNo++)
{
glNewList(ObjectNo,GL_COMPILE);//創建第ObjectNo個實體的顯示列表
for(Fac
OpenGL是近幾年發展起來的一個性能卓越的三維圖形標准,它是在SGI等多家
世界聞名的計算機公司的倡導下,以SGI的GL三維圖形庫為基礎制定的一個通
用共享的開放式三維圖形標准。目前,包括Microsoft、SGI、IBM、DEC、SUN、
HP等大公司都採用了OpenGL做為三維圖形標准,許多軟體廠商也紛紛以OpenGL
為基礎開發出自己的產品,其中比較著名的產品包括動畫製作軟體Soft Image
和3D Studio MAX、模擬軟體Open Inventor、VR軟體World Tool Kit、CAM軟
件ProEngineer、GIS軟ARC/INFO等等。值得一提的是,隨著Microsoft公司在
Windows NT和最新的Windows 95中提供了OpenGL標准及OpenGL三維圖形加速卡
(如北京黎明電子技術公司的AGC-3D系列三維圖形加速卡)的推出,OpenGL將
在微機中有廣泛地應用,同時也為廣大用戶提供了在微機上使用以前只能在高
性能圖形工作站上運行的各種軟體的機會。
OpenGL實際上是一個開放的三維圖形軟體包,它獨立於窗口系統和操作系統,
以它為基礎開發的應用程序可以十分方便地在各種平台間移植;OpenGL可以
與Visual C++緊密介面,便於實現機械手的有關計算和圖形演算法,可保證算
法的正確性和可靠性;OpenGL使用簡便,效率高。它具有七大功能:
1) 建模 OpenGL圖形庫除了提供基本的點、線、多邊形的繪制函數外,還提
供了復雜的三維物體(球、錐、多面體、茶壺等)以及復雜曲線和曲面
(如Bezier、Nurbs等曲線或曲面)繪制函數。
2) 變換 OpenGL圖形庫的變換包括基本變換和投影變換。基本變換有平移、
旋轉、變比鏡像四種變換,投影變換有平行投影(又稱正射投影)和透
視投影兩種變換。其變換方法與機器人運動學中的坐標變換方法完全一
致,有利於減少演算法的運行時間,提高三維圖形的顯示速度。
3) 顏色模式設置 OpenGL顏色模式有兩種,即RGBA模式和顏色索引(Color Index)。
4) 光照和材質設置 OpenGL光有輻射光(Emitted Light)、環境光
(Ambient Light)、漫反射光(Diffuse Light)和鏡面光(Specular Light)。
材質是用光反射率來表示。場景(Scene)中物體最終反映到人眼的顏色是光
的紅綠藍分量與材質紅綠藍分量的反射率相乘後形成的顏色。
5) 紋理映射(Texture Mapping) 利用OpenGL紋理映射功能可以十分逼真
地表達物體表面細節。
6) 點陣圖顯示和圖象增強 圖象功能除了基本的拷貝和像素讀寫外,還提供
融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖象效果處理。
以上三條可是被模擬物更具真實感,增強圖形顯示的效果。
7) 雙緩存(Double Buffering)動畫 雙緩存即前台緩存和後台緩存,簡而言
之,後台緩存計算場景、生成畫面,前台緩存顯示後台緩存已畫好的畫面。
此外,利用OpenGL還能實現深度暗示(Depth Cue)、運動模糊(Motion Blur)等
特殊效果。從而實現了消隱演算法。
㈦ 請問紋理映射在3dsmax如何操作
3dmax是這樣的使用過程
建立模型 模型被建立的時候是沒有材質和貼圖的 只是一個顏色
賦予材質 材質包括程序紋理和貼圖 noise等屬於程序紋理 是一些演算法生成的二維或三維數據 貼圖就是圖片了。這些信息賦予模型後 可以改變模型的外觀 通過不同的方法 實現不同的效果。
然後再打燈打攝像機渲染出圖做後期等等。
㈧ 什麼是GIS 的三維結構
此類GIS應用軟體通常多建立在OpenGL平台之上,本系統也不例外。在實現其他特殊功能之前,必須首先正確配置、安裝好OpenGL環境,然後才能進行各種實用功能的開發。下面將對OpenGL做一個簡短的介紹,並開始OpenGL應用程序框架的搭建工作。
OpenGL概述
OpenGL是一種到圖形硬體的軟體介面。從本質上說,它是一個完全可移植並且速度很快的3D圖形和建模庫。通過使用OpenGL,可以創建視覺質量接近射線跟蹤程序的精緻漂亮的3D圖形。但是它在執行速度上要比射線跟蹤程序快好幾個數量級。OpenGL使用的是由Silicon Graphcs(SGI)公司精心開發的優化演算法,這家公司在計算機圖形和動畫領域是公認的業界領袖。開發者可以利用OpenGL提供的150多個圖形函數輕松建立三維模型並進行三維實時交互。這些函數並不要求開發者將三維物體模型的數據寫成固定的數據格式,這樣一 來開發者就不僅可以直接使用自己的數據,而且還可以利用其他格式的數據源,能在很大程度上縮短軟體的開發周期。
OpenGL不僅可對整個三維模型進行渲染並繪制出逼真的三維景象,而且還可以進行三維交互、動作模擬等處理。其提供的基本功能具體包含以下幾方面的內容:
(1)模型繪制。在OpenGL中通過對點、線和多邊形等基本形體的繪制可以構造出非常復雜的三維模型。OpenGL經常通過使用模型的多邊形及其頂點來描述三維模型。
(2)模型觀察。在建立了三維模型後,可以通過OpenGL的描述來觀察此模型。此觀察過程是通過一系列的坐標變換來實現的。這種變換使得觀察者能夠在視點位置得到與之相適應的三維模型場景。投影變換的類型對模型的觀察有很大的影響,在不同投影變換下得到的三維模型場景也是不同的。在模型觀察過程的最後還要對場景進行裁剪和縮放,以決定整個三維模型場景在屏幕上的顯示。
(3)顏色模式的指定。在OpenGL中可以指定模型的顏色模式(RGBA模式和顏色表模式)。除此之外,還可以通過選擇模型的著色方式(平面著色和光滑著色)來對整個三維場景進行著色處理。
(4)光照效果。為使OpenGL繪制的三維模型更加逼真還必須增加光照效果。目前OpenGL僅提供了對輻射光、環境光、鏡面光和漫反射光的管理方法,另外還可以指定模型表面的反射特性。
(5)圖象效果增強。在增強三維場景圖象效果方面,OpenGL也提供了一系列相關函數。這些函數通過反走樣、混合和霧化等處理來增強圖象效果。其中,反走樣用於改善圖象中線形圖形的鋸齒使其更平滑;混合用於處理模型的半透明效果;霧化使場景圖象從視點到遠處逐漸褪色,使其更接近現實情況。
(6)點陣圖和圖象處理。OpenGL提供有專門進行點陣圖和圖象處理的函數。
(7)紋理映射。真實物體的表面普遍存在紋理,如果建立的三維模型場景缺少此細節將顯得不夠真實,為更逼真地表現三維場景,OpenGL提供了紋理映射的功能。OpenGL提供的紋理映射函數可以很方便地把紋理圖象貼到場景多邊形上。
(8)雙緩存技術。OpenGL提供的雙緩存技術主要用於實時動畫,為獲得平滑的動畫效果,需要先在內存中生成下一幀圖象,然後再將其從內存拷貝到屏幕。
(9)人機交互。OpenGL提供了方便的三維圖形人機交互介面,通過此介面用戶可以選擇修改三維景觀中的物體。
OpenGL應用程序框架的建立
首先建立一個單文檔應用程序,並將需要用到的頭文件和導入庫添加到工程,以便能夠順利通過編譯。在VC++中,OpenGL的頭文件一般是存放在系統頭文件目錄的子目錄GL中,所以在指定包含的時候要指定一下相對路徑:
#include <gl\gl.h> // OpenGL32庫的頭文件
#include <gl\glu.h> // GLu32庫的頭文件
#include <gl\glaux.h> // GLaux庫的頭文件
這里的gl.h是基本頭文件,glu.h是應用頭文件,大多數應用程序都需要同時包含這兩個頭文件,glaux.h是輔助頭文件,只在需要使用的情況下包含。接下來調出"Project Settings"對話框並在"Link"選項頁中添加glu32.lib、glaux.lib和OpenGL win32實現的標准導入庫opengl32.lib到工程。
接下來初始化OpenGL,這也是本文最重要的部分。先大致講一下基本步驟:首先獲取需要在上面繪圖的設備環境(DC)並為該設備環境設置像素格式,然後創建基於該設備環境的OpenGL設備。最後,初始化OpenGL繪制場景及狀態設置。前三步的實現過程在SetOpenGLInterface()函數中實現:
PIXELFORMATDESCRIPTOR pfd = {
// 初始化象素存儲格式
sizeof(PIXELFORMATDESCRIPTOR), // pfd的大小
1, // 版本號
PFD_DRAW_TO_WINDOW | // 支持窗口
PFD_SUPPORT_OPENGL | // 支持OpenGL
PFD_DOUBLEBUFFER, // 支持雙緩存
PFD_TYPE_RGBA, // RGBA類型
24, // 24位色深度
0, 0, 0, 0, 0, 0, // 各顏色位(忽略)
0, // 無alpha緩存
0, // 忽略轉換位
0, // 無累計位
0, 0, 0, 0,
32, // 32位深度緩存
0, // 無模版緩存
0, // 無輔助緩存
PFD_MAIN_PLANE, // 主繪制層
0, // 保留
0, 0, 0 // 忽略的層掩模
};
m_pDC = GetDC(); // 得到設備環境句柄
int iFormat = ChoosePixelFormat(m_pDC->m_hDC, &pfd); // 設置象素格式
SetPixelFormat(m_pDC->m_hDC, iFormat, &pfd);
m_hGlrc = wglCreateContext(m_pDC->m_hDC); // 創建渲染上下文
wglMakeCurrent(m_pDC->m_hDC, m_hGlrc); // 設置一個線程的當前繪圖描述表
這里首先對描述像素存儲格式的PIXELFORMATDESCRIPTOR結構變數進行了填充,在得到設備環境句柄後調用ChoosePixelFormat()和SetPixelFormat()函數以返回並設置最佳匹配的像素格式。最後調用wglCreateContext()創建一個渲染上下文RC並將其作為參數通過wglMakeCurrent()來建立一個當前的繪圖描述表,並在繪制完畢後(通常在WM_DESTORY消息發出後執行)將其釋放:
ReleaseDC(m_pDC); // 釋放DC
if (m_hGlrc != NULL) // 釋放RC
wglDeleteContext(m_hGlrc);
經過上面的處理OpenGL就已經初始化完畢了,但為了達到逼真的視覺效果還有必要進一步設置一下場景,這在InitOpenGL()函數中完成。具體的工作包括對光源的各種定義:
GLfloat light_position[] = {0.0, 0.0, 1.0, 0.0}; // 定義光源的位置坐標
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
GLfloat light_ambient[] = {0.0, 0.0, 0.0, 1.0}; // 定義環境反射光
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0}; // 定義漫反射光
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0}; // 定義鏡面反射光
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
GLfloat light_model_ambient[] = {0.4f, 0.4f, 0.4f, 1.0f}; // 定義光模型參數
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_model_ambient);
GLfloat local_view[] = {0.0};
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
以及各項相關功能的使能設置:
glEnable(GL_LIGHTING); // GL_LIGHTING有效
glEnable(GL_LIGHT0); // GL_LIGHT0有效
glEnable(GL_DEPTH_TEST); // 允許深度比較
glDepthFunc(GL_LESS); // 激活深度比較
glClearColor(0.1f, 0.1f, 0.5f, 0.0f); // 設置藍色背景
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); // 權衡圖像質量與繪制速度
通常,SetOpenGLInterface()和InitOpenGL()在WM_CREATE消息發出後即被執行,以確保在程序啟動之初完成對OpenGL的環境設置。在視圖初始化更新完畢後,還要進行最後的處理--進行視口的定義,下面給出的這段InitViewPort()函數實現代碼將完成此功能:
CRect rect; // 得到繪圖客戶區的大小
GetClientRect(rect);
glMatrixMode(GL_PROJECTION); // 設置投影模式
glLoadIdentity(); // 裝載單位矩陣
if (m_nViewMode == 0) // 建立一個透視投影矩陣
gluPerspective(90.0, rect.Width() / rect.Height(), 1.0, 10000.0);
if (m_nViewMode == 1) // 建立一個正射投影矩陣
glOrtho(-0.5 * 10000.0, 0.5 * 10000.0, -0.5 * 10000.0, 0.5 * 10000.0, 1.0, 10000.0); glViewport(0, 0, rect.Width(), rect.Height()); // 重定視口
glMatrixMode(GL_MODELVIEW); // 確定當前矩陣模式
glLoadIdentity(); // 裝載單位矩陣
這里完成的主要工作有對投影模式的設置與對投影矩陣的建立以及對視口的重定等。其中,控制變數m_nViewMode的取值決定了投影模式(透視投影還是正射投影),並根據不同的投影模式調用函數gluPerspective()或glOrtho()建立相應的投影矩陣。函數gluPerspective()用於創建一個對稱透視視景體,第一個參數定義了視野在X-Z平面的角度,取值范圍為[0.0, 180.0];第二個參數是投影平面寬度與高度的比率;後兩個參數分別為遠近裁剪面沿Z負軸到視點的距離,總為正值。glOrtho()用於創建一個平行視景體(實際是創建一個正射投影矩陣,並以此矩陣乘以當前矩陣)。其近裁剪、遠裁剪平面均為矩形,近裁剪矩形左下角點和右上角點的三維空間坐標分別為(left,bottom,-near)和(right,top,-near);遠裁剪平面的相應空間坐標分別為(left,bottom,-far)和(right,top,-far)。這里所有的near、far值同時為正或同時為負。若未進行其他變換,正射投影的方向將平行於Z軸、視點朝向Z負軸。
視口確定之後就可以著手對場景的繪制了。這主要在ReDraw()中完成,並在OnSize()、OnDraw()等需要重繪的地方被調用。由於這部分不屬於OpenGL框架搭建的內容,因此該函數的實現將在後續的文章中進行詳細介紹,這里不再贅述
㈨ opengl和d3d選哪個更好
各有各的優勢,做游戲現在D3D的較多,其他圖形工業圖形處理,虛擬現實用openGL的多點,還有用OSG的
OpenGL的發展歷程:
OpenGL的前身是SGI公司為其圖形工作站開發的IRIS GL。IRIS GL是一個工業標準的3D圖形軟體介面,功能雖強大但其移植性不好,於是SGI公司在IRIS GL的基礎上開發了OpenGL。OpenGL的英文全稱是「Open Graphics Library」,顧名思義,OpenGL是「開放性圖形程序介面」。
1992年7月,SGI公司發布了OpenGL的1.0版本,隨後又與微軟公司共同開發了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運行的大型3D圖形處理軟體也可以在微機上運用。
1995年OpenGL的1.1版本面市,該版本較1.0性能提高許多,並加入了一些新的功能。包括提高頂點位置、法線、顏色、色彩指數、紋理坐標、多邊形邊緣標識的傳輸速度,引入了新的紋理特性等等。
1997年,Windows 95下3D游戲的大量涌現,游戲開發公司迫切需要一個功能強大、兼容性好的3D圖形介面,而當時微軟公司自己的3D圖形介面DirectX 3.0功能卻是很糟糕。因而以製作《雷神之錘》等經典3D射擊游戲而著名的id公司同其它一些游戲開發公司一同強烈要求微軟在Windows 95中加入對OpenGL的支持。微軟公司最終在Windows 95的OSR2版和後來的Windows 版本中加入了對OpenGL的支持。這樣,不但許多支持OpenGL的電腦3D游戲得到廣泛應用,而且許多在3D圖形設計軟體也可以運用支持OpenGL標準的3D加速卡,大大提高其3D圖形的處理速度。
2003年的7月28日,SGI和ARB公布了OpenGL 1.5。OpenGL 1.5中包括OpenGL ARB的正式擴展規格繪制語言「OpenGL Shading Language」。OpenGL 1.5的新功包括:頂點Buffer Object、Shadow功能、隱蔽查詢、非乘方紋理等。
2004年8月,OpenGL2.0版本發布~OpenGL 2.0標準的主要制訂者並非原來的SGI,而是逐漸在ARB中占據主動地位的3Dlabs。opengl2.0支持OpenGL Shading Language、新的shader擴展特性以及其他多項增強特性。
OpenGL是做什麼用的:
上世紀90年代,OpenGL可謂大名鼎鼎,那時微軟的DirectX剛剛出現,功能遠不能與OpenGL相比,OpenGL實際上是一種3D程序介面(即我們常說的3D API),這個介面由近二百五十個不同的函數調用組成,用來從簡單的圖元繪制復雜的三維景象。它是3D加速卡硬體和3D圖形應用程序之間一座非常重要的溝通橋梁。也可以說,OpenGL是一個功能強大,調用方便的底層3D圖形庫。
OpenGL是個與.硬體無關的軟體介面,可以在不同的平台如Windows NT、Unix、Linux、MacOS、OS/2之間進行移植。因此,支持OpenGL的軟體具有很好的移植性,可以獲得非常廣泛的應用。
OpenGL特點及功能:
OpenGL是一個開放的三維圖形軟體包,它獨立於窗口系統和操作系統,以它為基礎開發的應用程序可以十分方便地在各種平台間移植;OpenGL可以與Visual C++緊密介面,便於實現機械手的有關計算和圖形演算法,可保證演算法的正確性和可靠性;OpenGL使用簡便,效率高。它具有七大功能:
1.建模:OpenGL圖形庫除了提供基本的點、線、多邊形的繪制函數外,還提供了復雜的三維物體(球、錐、多面體、茶壺等)以及復雜曲線和曲面繪制函數。
2.變換:OpenGL圖形庫的變換包括基本變換和投影變換。基本變換有平移、旋轉、變比鏡像四種變換,投影變換有平行投影(又稱正射投影)和透視投 影兩種變換。其變換方法有利於減少演算法的運行時間,提高三維圖形的顯示速度。
3.顏色模式設置:OpenGL顏色模式有兩種,即RGBA模式和顏色索引(Color Index)。
4.光照和材質設置:OpenGL光有輻射光(Emitted Light)、環境光(Ambient Light)、漫反射光(Diffuse Light)和鏡面光(Specular Light)。材質是用光反射率來表示。場景(Scene)中物體最終反映到人眼的顏色是光的紅綠藍分量與材質紅綠藍分量的反射率相乘後形成的顏色。
5:紋理映射(Texture Mapping)。利用OpenGL紋理映射功能可以十分逼真地表達物體表面細節。
6:點陣圖顯示和圖象增強圖象功能除了基本的拷貝和像素讀寫外,還提供融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖象效果處理。以上三條可使被模擬物更具真實感,增強圖形顯示的效果。
7:雙緩存動畫(Double Buffering)雙緩存即前台緩存和後台緩存,簡言之,後台緩存計算場景、生成畫面,前台緩存顯示後台緩存已畫好的畫面。
此外,利用OpenGL還能實現深度暗示(Depth Cue)、運動模糊(Motion Blur)等特殊效果。從而實現了消隱演算法。
OpenGL現狀:
近年來,依靠著微軟的研發實力和Windows在操作系統市場的統治地位,DirectX在3D游戲API上占據了絕對的優勢。而曾經紅極一時的OpenGL則顯得停滯不前。目前我們熟悉的OpenGL游戲可能只剩下了id出品的《Quake》和《Doom》系列可以勉強支撐。OpenGL的未來究竟如何?OpenGL仍然是唯一能夠取代微軟對3D圖形技術的完全控制的API,目前,OpenGL也仍是唯一的跨平台3D解決方案,它仍然具有一定的生命力,游戲開發人員是一個有著獨立思想的群體,很多重要的開發人員目前仍然在使用Open GL。因此,硬體開發商正在設法加強對它的支持。
目前,隨著DirectX的不斷發展和完善,OpenGL的優勢逐漸喪失,未來的OpenGL發展前景迷茫。OpenGL與DirectX代表著繪圖世界分裂的兩大門派,這種情況有時會阻礙發展,有時卻又有利於與發展。畢竟有競爭才會有發展。如同處理器市場我們不希望AMD倒掉,也不希望INTEL一家獨大一樣~我們都不希望在3D領域中僅僅剩下一個霸主。希望OpenGL一路走好。。。。。。
另:2007年8月8日,聖迭戈Siggraph BOF展會上 OpenGL Architecture Review Board(OpenGL架構評估委員會)正式宣布了OpenGL 3。以前被稱之為OpenGL Longs Peak,OpenGL 3則是官方名稱。OpenGL 3規范將在下一次8月底召開的OpenGL ARB會議上最後定案,由Khronos Group進行為期30天的評估後在9月底正式公開。最新的OpenGL Shading Language也伴隨OpenGL 3公開展示。
d3d
要講Direct3D不能不講DirectX, DirectX是微軟開發並發布的多媒體開發軟體包,其中有一部分叫做DirectDraw是圖形繪演API,提供對圖形的強大的訪問處理能力,而在DirectDraw中集成了一些三維圖形相關的功能,叫做Direct3D。
D3D和OPENGL本質雖然一樣,Direct3D (D3D)是微軟為提高3D 游戲在Win 95/98中的顯示性能而開發的顯示程序,目前已經升級到9.0版本,而且支持XP等微軟最新的操作系統,它提供了豐富的3D功能庫,是游戲廣泛採用的標准。
Direct 3D是基於微軟的通用對象模式COM(Common Object Mode)的3D圖形API。它是由微軟(Microsoft)一手樹立的3D API規范,微軟公司擁有該庫版權,它所有的語法定義包含在微軟提供的程序開發組件的幫助文件、源代碼中。Direct3D是微軟公司DirectX SDK集成開發包中的重要部分,適合多媒體、娛樂、即時3D動畫等廣泛和實用的3D圖形計算。自1996年發布以來,Direct3D以其良好的硬體兼容性和友好的編程方式很快得到了廣泛的認可,現在幾乎所有的具有3D圖形加速的主流顯示卡都對Direct3D提供良好的支持。但它也有缺陷,由於是以COM介面形式提供的,所以較為復雜,穩定性差,所以D3D是一個十分繁瑣的工具,盡管Microsoft已經盡可能地簡化了,但是為了實現一個效果,你還是不得不做許多的工作,其中就包括對各種復雜的結構的賦值;這些賦值很重要,它直接關繫到程序的最終效果。另外,目前只在Windows平台上可用。