【連載】現代OpenGL介紹(一)

發(fā)布時(shí)間:2014-7-22 11:04    發(fā)布者:eechina
關(guān)鍵詞: OpenGL
第一章:繪制管線(xiàn)

OpenGL的誕生有很長(cháng)時(shí)間了,讀過(guò)互聯(lián)網(wǎng)上成百上千的文檔后,很難明確哪一部分是老的內容,哪一部分在現代圖形硬件上仍然可以繼續使用。是時(shí)候對如今仍在使用的OpenGL做一次新的介紹了。

什么是OpenGL

Wikipedia 對OpenGL的用途和歷史做了一個(gè)全面的回顧,但是這里我還是簡(jiǎn)要的總結一下。在現代的體系中,OpenGL是一個(gè)和可編程GPU進(jìn)行交互的跨平臺程序庫,用于繪制實(shí)時(shí)3D圖形。在游戲、CAD和數據可視化程序中被廣泛使用。OpenGL最早出現在90年代,是作為一個(gè)跨平臺SGI專(zhuān)用圖形庫的標準,SGI專(zhuān)用圖形庫用于在其高端工作站上驅動(dòng)圖形硬件。

幾年以后,GLQuake和3dfx的Voodoo圖形加速卡漸成主流,OpenGL也成為除了Microsoft專(zhuān)用Direct3d程序庫以外,用于操作普通PC機上圖形加速卡的又一個(gè)標準。近幾年來(lái),Khronos組織管理OpenGL標準,不斷更新使之可以支持現代可編程GPU,并通過(guò)OpenGL ES和WebGL將它擴展至移動(dòng)和網(wǎng)絡(luò )領(lǐng)域。OpenGL 3拋棄了那些老版本中變得混亂的過(guò)時(shí)特性,讓OpenGL越發(fā)精簡(jiǎn)流暢。

最近的另一個(gè)發(fā)展是通用GPU(GPGPU)庫,包括NVIDIA的CUDA技術(shù)和Khronos的OpenCL。這些庫通過(guò)一種類(lèi)C語(yǔ)言,增加了數據并行特性,讓GPU能用于普通計算,而不必在OpenGL的圖形框架之下。然而,這些GPGPU的框架并沒(méi)有取代OpenGL;因為他們的主要目的不是圖形編程,它們只是提供了訪(fǎng)問(wèn)GPU的運算單元,而忽視專(zhuān)用的圖形硬件。雖然這樣做是可行的,但作為OpenGL的配件,支持CUDA和OpenCL既可以分享GPU與OpenGL的內存緩沖區,又可以在GPGPU程序和圖形管線(xiàn)之間傳遞數據。 GPGPU不在本次介紹之列,我的重點(diǎn)是使用OpenGL完成圖形(編程)。

對于這些教程,假設你已經(jīng)是一個(gè)程序員,知道C語(yǔ)言,但之前不一定見(jiàn)過(guò)OpenGL或進(jìn)行圖形編程。了解一些基本的代數和幾何知識將有很大的幫助。我會(huì )覆蓋OpenGL 2.0避免討論在OpenGL 3或者OpenGL ES中不推薦或者拋棄的任何API。在講完基礎知識以后,我會(huì )談?wù)凮penGL 3和4的一些新功能。除了OpenGL,我將使用兩個(gè)輔助庫:GLUT(GL實(shí)用工具包),它提供了一個(gè)跨平臺的OpenGL和窗口系統接口,GLEW(GL擴展),它簡(jiǎn)化了不同版本的OpenGL及其擴展。

從哪里獲得OpenGL, Glut 和Glew

OpenGL的標準以某種形式存在于MacOS X,Windows和大多數Linux發(fā)行版中。如果你想繼續學(xué)習這些教程,你需要確保你的OpenGL實(shí)現支持至少2.0。 MacOS X系統即使圖形卡驅動(dòng)程序不提供,也能通過(guò)軟件實(shí)現OpenGL 2.0。在Windows上,取決于你的圖形卡驅動(dòng)程序提供OpenGL 2或更高版本。你可以使用RealTech免費的OpenGL擴展查看器,看看你的驅動(dòng)程序所支持的OpenGL版本。近4年來(lái)NVIDIA和AMD發(fā)行的圖形卡所提供的驅動(dòng)至少支持OpenGL 2.0。Intel板載圖形卡以及老的顯卡用戶(hù)沒(méi)有那么幸運。對于后者,Mesa提供了一個(gè)開(kāi)源、跨平臺的OpenGL 2.1軟件實(shí)現,在Windows和幾乎所有的Unix平臺上都可以運行。

Mesa是最常見(jiàn)的Linux中OpenGL實(shí)現,它和X服務(wù)使用“直接渲染接口”(DRI)通過(guò)圖形硬件與OpenGL交互。你可以通過(guò)運行一個(gè)xterm的glxinfo命令來(lái)查看您的DRI驅動(dòng)程序是否支持OpenGL 2.0。如果不支持,你可以禁用該驅動(dòng)程序,使用Mesa的軟件實(shí)現。 nVidia對于他們自己的GPU也提供專(zhuān)有的針對Linux的OpenGL實(shí)現,對于目前的NVidia圖形卡,都能支持OpenGL 2.0或以后更高版本。

要安裝GLUT和GLEW,在它們各自的網(wǎng)站上找到二進(jìn)制包。MacOS X預裝了GLUT。大多數Linux發(fā)行版都可以在其打包系統資源得到GLUT和GLEW。對于GLUT你可能還需要開(kāi)啟你的發(fā)行版中 “非自由”套件庫選項,因為它的許可并不是技術(shù)開(kāi)源。如果你對它要求很高,有一個(gè)開(kāi)源的GLUT克。篛penGLUT可以使用。(譯者注:我沒(méi)有linux的編程經(jīng)驗,有不準確的請見(jiàn)諒)

如果你是一位經(jīng)驗豐富的C語(yǔ)言程序員,你應該能夠安裝這些庫,并讓他們在你的開(kāi)發(fā)環(huán)境中順暢工作。在我們開(kāi)始編寫(xiě)代碼之前,我要講一些籠統的概念。在這第一章,我要解釋圖形管線(xiàn)和數據流的繪制工作。在下一章,我們將編寫(xiě)一個(gè)簡(jiǎn)單的“Hello World”程序,將圖像文件繪制到屏幕上,顯示該管線(xiàn)是如何工作的。

圖形管線(xiàn)



早期的實(shí)時(shí)三維,三角形是場(chǎng)景繪制的一切。雖然現代圖形處理器可以執行各種花哨的效果來(lái)掩蓋這個(gè)秘密,但在所有的效果之下,三角形仍然是GPU工作的介質(zhì)。 OpenGL的圖形管線(xiàn)反映了這一點(diǎn):主程序填充OpenGL頂點(diǎn)數組管理的內存緩沖區,這些頂點(diǎn)投影到屏幕空間并組裝成三角形,通過(guò)光柵化生成像素大小的片元,然后片元被分配顏色值并繪制到幀緩沖區,F代圖形處理器可以使用著(zhù)色器來(lái)實(shí)現“投影到屏幕空間”和“分配顏色值”獲取靈活性。讓我們來(lái)看看每個(gè)階段的細節:

頂點(diǎn)和圖元數組

渲染工作通過(guò)管線(xiàn)中一個(gè)或者多個(gè)填充著(zhù)頂點(diǎn)屬性值的頂點(diǎn)緩沖區開(kāi)始,這些屬性用于頂點(diǎn)著(zhù)色器的輸入。常見(jiàn)的頂點(diǎn)屬性包括在三維空間的頂點(diǎn)位置,一個(gè)或多個(gè)紋理坐標集合,紋理坐標用于將頂點(diǎn)映射到一個(gè)或者多個(gè)紋理的采樣點(diǎn)。這一系列提供數據給繪制工作的頂點(diǎn)緩沖區即稱(chēng)之為頂點(diǎn)數組。當繪制任務(wù)提交時(shí),我們提供一個(gè)額外的圖元數組到頂點(diǎn)數組中,即一個(gè)索引數組,用來(lái)選擇哪些頂點(diǎn)進(jìn)入繪制管線(xiàn)。索引值的順序還可以控制以后頂點(diǎn)如何裝配成三角形。

統一狀態(tài)和紋理

繪制任務(wù)也有統一的渲染工作狀態(tài),它在管線(xiàn)的每一個(gè)可編程階段都提供了一系列共享的只讀值。這使得著(zhù)色器程序在頂點(diǎn)和片元之間能保持參數不改變。統一的狀態(tài)包括紋理,可以是能被著(zhù)色器采樣的一維,二維,或三維數組。顧名思義,紋理通常用來(lái)將圖片映射到表面上,它們也可以用來(lái)作為預先計算函數的查找表,或作為各種效果的數據集。

頂點(diǎn)著(zhù)色器

GPU從頂點(diǎn)數組中讀取每一個(gè)選擇的頂點(diǎn),通過(guò)頂點(diǎn)著(zhù)色器來(lái)執行它,頂點(diǎn)著(zhù)色器是將一系列頂點(diǎn)屬性作為輸入并輸出一系列新屬性的程序,這些屬性稱(chēng)之為變量,用于提交給光柵化處理。在頂點(diǎn)著(zhù)色器中至少要計算屏幕空間頂點(diǎn)的投影位置。頂點(diǎn)著(zhù)色器也可以產(chǎn)生其他的輸出變量,比如顏色、紋理坐標,用于光柵化為混合連接頂點(diǎn)的三角形表面。

三角形裝配


GPU連接投影后頂點(diǎn)來(lái)組建三角形。它通過(guò)圖元數組所指示的順序講頂點(diǎn)組織成“三個(gè)頂點(diǎn)”的結合。頂點(diǎn)可以被組織為幾種不同的方式:

以每三個(gè)元素作為一個(gè)獨立的三角形。
設為一個(gè)三角形條帶,重用三角形的最后兩個(gè)頂點(diǎn),作為下一個(gè)三角形的前兩個(gè)頂點(diǎn)。
設為三角形扇面,連接的第一個(gè)元素到后面的每一對元素。



該圖顯示了三種不同模式的行為。條帶和扇面在第一個(gè)三角形之后的每一個(gè)三角形都只需要一個(gè)新的索引就能構建,平衡了圖元數組中獨立三角形的靈活性和額外的存儲效率。

光柵化


光柵化處理每一個(gè)三角形,裁切或者丟棄屏幕之外三角形,將可見(jiàn)的三角形分割成像素大小的片元。如上所述,頂點(diǎn)著(zhù)色器的輸出也被插值,并光柵化到每一個(gè)三角形的表面,同時(shí)將每一個(gè)片元之間光滑過(guò)度。例如,如果頂點(diǎn)著(zhù)色器分配每個(gè)頂點(diǎn)一個(gè)顏色值,光柵化將融合像素化表面的顏色,如圖所示。



片元著(zhù)色器

生成的片元提交給另一個(gè)稱(chēng)為片元著(zhù)色器的程序。片元著(zhù)色器接收到頂點(diǎn)著(zhù)色器輸出的變量,通過(guò)光柵化作為輸入進(jìn)行插值。它輸出顏色和深度值,然后進(jìn)入幀緩存進(jìn)行繪制。普通片元著(zhù)色器操作包括紋理映射和光照處理。由于片元著(zhù)色器對每一個(gè)像素的繪制獨立運行,它可以執行最復雜的特殊效果,同時(shí)它也是圖形管線(xiàn)中對性能最敏感的部分。

幀緩存,測試和混合

幀緩存的是渲染工作輸出的最終目的地。除了OpenGL給你的用于繪制到屏幕上的默認幀緩存以外,現代的OpenGL實(shí)現可以讓你繪制到離屏的幀緩存對象或者紋理上。這些紋理可以被用來(lái)作為其他渲染工作的輸入。幀緩存不僅僅是一個(gè)單一的二維圖像,除了一個(gè)或多個(gè)顏色緩沖區,幀緩存可以擁有一個(gè)深度緩沖區或者模板緩沖區,這兩種緩沖區在片元繪制到幀緩沖區之前對其進(jìn)行過(guò)濾。深度測試將放置在已繪制片元之后的片元丟棄,模板測試使用形狀將緩沖區對象的可繪制部分繪制到模板緩沖區中。片元將它們的顏色值和“覆蓋”的顏色值進(jìn)行混合,最終的顏色、深度和模板值繪制到相應的緩沖區中。

結論

這就是你在OpenGL中調用“繪制”方法時(shí),數據從頂點(diǎn)緩存到幀緩存的過(guò)程。渲染一個(gè)場(chǎng)景通常涉及多個(gè)繪制工作,變換紋理、其他的統一狀態(tài)或者階段之間的著(zhù)色器,以及使用幀緩存的深度和模板緩沖區來(lái)結合每個(gè)階段的繪制結果,F在我們已經(jīng)覆蓋了三維渲染一般的數據流過(guò)程,我們可以寫(xiě)一個(gè)簡(jiǎn)單的程序,看看OpenGL中這一切是如何發(fā)生的。在整個(gè)教程的過(guò)程中,我很想知道您的反饋意見(jiàn),如果有幫助請告知我,或者這些對你沒(méi)有任何意義。
本文地址:http://selenalain.com/thread-131046-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页