色偷偷偷久久伊人大杳蕉,色爽交视频免费观看,欧美扒开腿做爽爽爽a片,欧美孕交alscan巨交xxx,日日碰狠狠躁久久躁蜜桃

x
x

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

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

OpenGL的誕生有很長(zhǎng)時(shí)間了,讀過(guò)互聯(lián)網(wǎng)上成百上千的文檔后,很難明確哪一部分是老的內(nèi)容,哪一部分在現(xiàn)代圖形硬件上仍然可以繼續(xù)使用。是時(shí)候?qū)θ缃袢栽谑褂玫腛penGL做一次新的介紹了。

什么是OpenGL

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

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

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

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

從哪里獲得OpenGL, Glut 和Glew

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

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

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

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

圖形管線



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

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

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

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

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

頂點(diǎn)著色器

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

三角形裝配


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

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



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

光柵化


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



片元著色器

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

幀緩存,測(cè)試和混合

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

結(jié)論

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

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

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表