通過(guò)OpenGL理解前端渲染原理(1)-創(chuàng)新互聯(lián)

一、OpenGL

OpenGL,是一套繪制3D圖形的API,當(dāng)然它也可以用來(lái)繪制2D的物體。OpenGL有一大套可以用來(lái)操作模型和圖片的函數(shù),通常編寫(xiě)OpenGL庫(kù)的人是顯卡的制造者。我們買(mǎi)的顯卡都支持特定版本的OpenGL。

專(zhuān)注于為中小企業(yè)提供網(wǎng)站制作、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)古田免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過(guò)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

下圖是用OpenGL做的旋轉(zhuǎn)的立方體。

通過(guò)OpenGL理解前端渲染原理(1)

二、渲染原理

2.1 渲染管道

在OpenGL中,所有東西都在一個(gè)3D的空間里,而我們的屏幕和窗口都是2D的,所以O(shè)penGL需要將3D的坐標(biāo)轉(zhuǎn)換成2D的坐標(biāo),做這件事的是OpenGL中的渲染管道(graphics pipeline)。

渲染管道可以分成兩大部分:第一部分將3D坐標(biāo)轉(zhuǎn)換成2D坐標(biāo);第二部分把2D的坐標(biāo)轉(zhuǎn)換成實(shí)際的像素。

2.2 著色器

通常來(lái)說(shuō),渲染管道把一組3D坐標(biāo)轉(zhuǎn)換成屏幕上帶有顏色的2D像素需要經(jīng)過(guò)很多步。上一步的輸出作為下一步的輸入,所有步驟都是高度專(zhuān)一的,每步都有一個(gè)特定的函數(shù),且可以很容易地并發(fā)執(zhí)行。顯卡有數(shù)千個(gè)處理核心來(lái)快速處理渲染管道中的數(shù)據(jù),而這些是在每個(gè)步驟中通過(guò)運(yùn)行在GPU上的多個(gè)小程序來(lái)處理的,這些小的程序被稱(chēng)之為程序著色器(shader)。

其中的一些著色器是可以配置的,開(kāi)發(fā)者可以根據(jù)需求配置自己的著色器去替代已經(jīng)存在的那些,這就讓我們能夠更自由和細(xì)粒度地控制渲染的過(guò)程。同時(shí),因?yàn)樗鼈冞\(yùn)行在GPU上,又給我們保留了珍貴的GPU時(shí)間,在平時(shí)的開(kāi)發(fā)中,我們也要充分利用GPU渲染來(lái)提高軟件性能。

著色器通常使用GLSL來(lái)寫(xiě),全稱(chēng)是OpenGL Shading Language。

2.3 舉個(gè)例子

下圖展示了一個(gè)抽象的渲染管線中的步驟,其中藍(lán)色部分是我們可以注入自己的著色器。

通過(guò)OpenGL理解前端渲染原理(1)

通過(guò)上圖我們發(fā)現(xiàn),要把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換成全渲染的像素要經(jīng)過(guò)很多步,接下來(lái)我們對(duì)每一個(gè)步驟和代碼進(jìn)行簡(jiǎn)單的解釋。

我們?cè)阡秩竟芫€中傳入一組可以組成三角形的3D坐標(biāo)數(shù)據(jù),這組數(shù)據(jù)即頂點(diǎn)數(shù)據(jù)。頂點(diǎn)數(shù)據(jù)是頂點(diǎn)的集合,而一個(gè)頂點(diǎn)是一個(gè)3D坐標(biāo)的集合。

渲染管線的第一步是頂點(diǎn)著色器(Vertex Shader)。我們這里傳入的是一個(gè)簡(jiǎn)單的頂點(diǎn),頂點(diǎn)著色器可以讓我們做一些基礎(chǔ)的處理操作,比如頂點(diǎn)的屬性。

在初始裝配階段,也就是Shape Assembly階段,從頂點(diǎn)著色器中輸出的頂點(diǎn)會(huì)形成一個(gè)原始的形狀。本例中,輸出的頂點(diǎn)形成的是一個(gè)三角形。

從初始裝配階段到geometry shader階段,我們可以通過(guò)發(fā)散其他頂點(diǎn)來(lái)形成新的圖形,本例中形成了第二個(gè)三角形。

在Tessellation Shader階段,可以把上一階段給出的原型圖再分割成若干個(gè)小的原型圖。本例中,可以形成更多的三角形來(lái)創(chuàng)造一個(gè)更加平坦、順滑的環(huán)境。這么說(shuō)可能難以理解,我們結(jié)合下圖來(lái)進(jìn)一步闡述,這就是細(xì)分曲面著色器的作用。

通過(guò)OpenGL理解前端渲染原理(1)

細(xì)分曲面著色器的下一階段是光柵化階段(Rasterzation stage),在這一階段會(huì)對(duì)最終的原型和呈現(xiàn)在屏幕上的對(duì)應(yīng)像素做一個(gè)映射,形成fragment,供下一階段的fragment shader使用。

Fragment shader最主要的使命是計(jì)算出一個(gè)像素的最終顏色,在這個(gè)階段我們可以使用OpenGL中一些高級(jí)的特效。通常fragment shader會(huì)包含3D界面的多個(gè)數(shù)據(jù),包括燈光、陰影、顏色等等。

當(dāng)所有對(duì)應(yīng)的顏色都確定以后,最終的原型將會(huì)被傳入最后一個(gè)步驟,我們稱(chēng)之為Alpha test and blending階段。這個(gè)階段會(huì)判斷相應(yīng)的深度,比如一個(gè)物體可能在另一個(gè)物體的后面,那它可能采用其他的顏色;或者如果該物體被遮擋,可能會(huì)被裁掉。

如上文所述,我們可以看到整個(gè)渲染管線的步驟和邏輯是十分復(fù)雜的,這其中包含了很多個(gè)可以改變的步驟,但我們一般只操作Vertex Shader 和 fragment shader,其他的著色器我們會(huì)直接采用默認(rèn)的。在實(shí)際的OpenGL編程中,我們至少需要定義一個(gè)Vertex Shader和Fragment shader。(需要說(shuō)明的是,OpenGL 3.1之前的版本包含了固定管線,從3.1版本開(kāi)始,固定管線從核心中刪掉了,因此我們必須使用著色器去工作)。

三、總結(jié)

本文為該系列文章的第一篇,先簡(jiǎn)單介紹OpenGL的一些原理,后續(xù)文章中會(huì)添加新的代碼分析,包括著色器(Shader)、紋理(Textture)、變形(transformation)、坐標(biāo)系統(tǒng)(Coordinate systems)、相機(jī)(Camera)等。

作者:崔曉迪

來(lái)源:宜信技術(shù)學(xué)院

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞名稱(chēng):通過(guò)OpenGL理解前端渲染原理(1)-創(chuàng)新互聯(lián)
分享地址:http://www.muchs.cn/article38/sphsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站排名、網(wǎng)站導(dǎo)航、網(wǎng)站維護(hù)、企業(yè)建站網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)