




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Shader引言shader到底是干什么用的?shader的工作原理是什么?其實(shí)當(dāng)我們對(duì)這個(gè)問(wèn)題還很懵懂的時(shí)候,就已經(jīng)開(kāi)始急不可耐的要四處搜尋有關(guān)shader的資料,恨不得立刻上手寫一個(gè)出來(lái)。但看了一些資料甚至看了不少cg的語(yǔ)法之后,我們還是很迷茫,UNITY_MATRIX_MVP到底是個(gè)什么矩陣?它和v.vertex相乘出來(lái)的又是什么玩意?當(dāng)這些問(wèn)題困擾我們很久之后,我們才發(fā)現(xiàn),原來(lái)我們是站在浮沙上筑高臺(tái),根基都沒(méi)有打牢當(dāng)然不可能蓋得起高樓大廈了。那根基是什么呢?大牛曰,計(jì)算機(jī)圖形學(xué)。shader中文名叫著色器,顧名思義,它的作用可以先簡(jiǎn)單理解為給屏幕上的物體畫上顏色。而什么東西負(fù)責(zé)給屏幕上
2、畫顏色?當(dāng)然是GPU,所以我們寫shader的目的就是告訴GPU往屏幕哪里畫、怎么畫。說(shuō)到這其實(shí)大家應(yīng)該很明白了,如果我們連GPU的工作原理都不知道,何談指揮它?說(shuō)到計(jì)算機(jī)圖形學(xué),包括我在內(nèi)很多同學(xué)都非常害怕它,因?yàn)槔锩姘烁鞣N艱深的理論、變換,大量的公式什么的。其實(shí)我們大可不必一開(kāi)始就嚇倒自己,先從基本概念開(kāi)始,慢慢來(lái),總有一天我們也會(huì)成為大牛!最后,這篇文章不算是原創(chuàng),最多算是摘要+讀后感,很多概念性文字都是我從書里搬過(guò)來(lái)后再加上自己的理解,算是和大家一起學(xué)習(xí),有理解不當(dāng)之處還請(qǐng)多多指教。廢話不多說(shuō),讓我們來(lái)進(jìn)入第一章的學(xué)習(xí),GPU的渲染管線。正文所謂GPU的渲染管線,聽(tīng)起來(lái)好像很高深的
3、樣子,其實(shí)我們可以把它理解為一個(gè)流程,就是我們告訴GPU一堆數(shù)據(jù),最后得出來(lái)一副二維圖像,而這些數(shù)據(jù)就包括了”視點(diǎn)、三維物體、光源、照明模型、紋理”等元素。在各種圖形學(xué)的書中,渲染管線主要分為三個(gè)階段:應(yīng)用程序階段、幾何階段、光柵階段。1,應(yīng)用程序階段。這個(gè)階段相對(duì)比較好理解,就比如我們?cè)赨nity里開(kāi)發(fā)了一個(gè)游戲,其實(shí)很多底層的東西Unity都幫我們實(shí)現(xiàn)好了,例如碰撞檢測(cè)、視錐剪裁等等,這個(gè)階段主要是和CPU、內(nèi)存打交道,在把該計(jì)算的都計(jì)算完以后,在這個(gè)階段的末端,這些計(jì)算好的數(shù)據(jù)(頂點(diǎn)坐標(biāo)、法向量、紋理坐標(biāo)、紋理)就會(huì)通過(guò)數(shù)據(jù)總線傳給圖形硬件,作為我們進(jìn)一步處理的源數(shù)據(jù)。2,幾何階段。主要
4、負(fù)責(zé)頂點(diǎn)坐標(biāo)變換、光照、裁剪、投影以及屏幕映射,改階段基于GPU進(jìn)行運(yùn)算,在該階段的末端得到了經(jīng)過(guò)變換和投影之后的頂點(diǎn)坐標(biāo)、顏色、以及紋理坐標(biāo)。簡(jiǎn)而言之,幾何階段的主要工作就是“變換三維頂點(diǎn)坐標(biāo)”和“光照計(jì)算”。問(wèn)題隨之而來(lái),為什么要變換頂點(diǎn)坐標(biāo)?我是這么理解的,比如你有一個(gè)三維游戲場(chǎng)景,場(chǎng)景中的每個(gè)模型都可以用一個(gè)向量來(lái)確定它的位置,但如何讓計(jì)算機(jī)根據(jù)這些坐標(biāo)把模型正確的、有層次的畫在屏幕上?這就是我們需要變換三維頂點(diǎn)坐標(biāo)的原因,最終目的就是讓GPU可以將這些三維數(shù)據(jù)繪制到二維屏幕上。根據(jù)頂點(diǎn)坐標(biāo)變換的先后順序,主要有如下幾個(gè)坐標(biāo)空間:Object space,模型坐標(biāo)空間;World sp
5、ace,世界坐標(biāo)空間;Eye space,觀察坐標(biāo)空間;Clip and Project space,屏幕坐標(biāo)空間。下圖就是GPU的整個(gè)處理流程,深色區(qū)域就是頂點(diǎn)坐標(biāo)空間的變換流程,大家了解一下即可,我們需要關(guān)注的是每個(gè)坐標(biāo)空間的具體含義和坐標(biāo)空間之間轉(zhuǎn)換的方法。圖片:image1.png2.1,從object space到world spaceobject space有兩層核心含義,第一,object space中的坐標(biāo)值就是模型文件中的頂點(diǎn)值,這些值是在建立模型時(shí)得到的,例如一個(gè).max文件,里面包含的數(shù)據(jù)就是object space的坐標(biāo)。第二,object space的坐標(biāo)與其他物體沒(méi)
6、有任何參照關(guān)系,這是object space和world space區(qū)分的關(guān)鍵。world space坐標(biāo)的實(shí)際意義就有有一個(gè)坐標(biāo)原點(diǎn),物體跟坐標(biāo)原點(diǎn)相比較才能知道自己的確切位置。例如在unity中,我們將一個(gè)模型導(dǎo)入到場(chǎng)景中以后,它的transform就是世界坐標(biāo)。2.2,從world space到eye space所謂eye space,就是以攝像機(jī)為原點(diǎn),由視線方向、視角和遠(yuǎn)近平面,共同組成的一個(gè)梯形體,如下圖,稱之為視錐(viewing frustum)。近平面,是梯形體較小的矩形面,也是靠近攝像機(jī)的平面,遠(yuǎn)平面就是梯形體較大的矩形,作為投影平面。在這個(gè)梯形體的內(nèi)的數(shù)據(jù)是可見(jiàn)的,超出的
7、部分會(huì)被視點(diǎn)去除,也叫視錐剪裁。例如在游戲中的漫游功能,屏幕的內(nèi)容隨攝像機(jī)的移動(dòng)而變化,這是因?yàn)镚PU將物體的頂點(diǎn)坐標(biāo)從world space轉(zhuǎn)換到了eye space。圖片:image2.png2.3,從eye space到project and clip spaceeye space坐標(biāo)轉(zhuǎn)換到project and clip space坐標(biāo)的過(guò)程其實(shí)就是一個(gè)投影、剪裁、映射的過(guò)程。因?yàn)樵诓灰?guī)則的視錐體內(nèi)剪裁是一件非常困難的事,所以前人們將剪裁安排到一個(gè)單位立方體中進(jìn)行,這個(gè)立方體被稱為規(guī)范立方體(CCV),CVV的近平面(對(duì)應(yīng)視錐體的近平面)的x、y坐標(biāo)對(duì)應(yīng)屏幕像素坐標(biāo)(左下角0、0),z
8、代表畫面像素深度。所以這個(gè)轉(zhuǎn)換過(guò)程事實(shí)上由三步組成:(1),用透視變換矩陣把頂點(diǎn)從視錐體變換到CVV中;(2),在CVV內(nèi)進(jìn)行剪裁;(3),屏幕映射:將經(jīng)過(guò)前兩步得到的坐標(biāo)映射到屏幕坐標(biāo)系上。2.4,primitive assembly(圖元裝配)和triangle setup(三角形處理)到目前為止我們得到了一堆頂點(diǎn)的數(shù)據(jù),這一步就是根據(jù)這些頂點(diǎn)的原始連接關(guān)系還原出網(wǎng)格結(jié)構(gòu)。網(wǎng)格由頂點(diǎn)和索引組成,這個(gè)階段就是根據(jù)索引將頂點(diǎn)鏈接到一起,組成線、面單元,然后進(jìn)行剪裁,如果一個(gè)三角形超出屏幕以外,例如兩個(gè)頂點(diǎn)在屏幕內(nèi),一個(gè)頂點(diǎn)在屏幕外,這時(shí)我們?cè)谄聊簧峡吹降木褪且粋€(gè)四邊形,然后把這個(gè)四邊形切成兩個(gè)
9、小的三角形。現(xiàn)在我們得到了一堆在屏幕坐標(biāo)上的三角形面片,這些面片是用于光柵化的。3,光柵化階段。經(jīng)過(guò)上面的步驟之后,我們得到了每個(gè)點(diǎn)的屏幕坐標(biāo)值,和我們需要繪制的圖元,但此時(shí)還有兩個(gè)問(wèn)題:(1)屏幕坐標(biāo)是浮點(diǎn)數(shù),但像素是用整數(shù)來(lái)表示的,如何確定屏幕坐標(biāo)值所對(duì)應(yīng)的像素?(2)如何根據(jù)已確定位置的點(diǎn),在屏幕上畫出線段或者三角形?對(duì)于問(wèn)題1,繪制的位置只能接近兩指定端點(diǎn)間的實(shí)際線段位置,例如,一條線段的位置是(10.48, 20.51),轉(zhuǎn)換為像素位置就是(10,21)。問(wèn)題2,涉及到具體的畫線和填充算法,有興趣的話可以研究。這個(gè)過(guò)程結(jié)束后,頂點(diǎn)和圖元已經(jīng)對(duì)應(yīng)到像素,之后的流程就是如何處理像素,即給
10、像素賦予顏色值。給像素賦予顏色的階段稱為Pixel Operation,是在更新幀緩存之前,執(zhí)行最后一系列針對(duì)每個(gè)片段的操作,其目的是計(jì)算出每個(gè)像素的顏色值。在這個(gè)階段,被遮擋的面通過(guò)一個(gè)被稱為深度測(cè)試的過(guò)程消除。pixel operation包含下面這些流程:(1)消除遮擋面;(2)Texture operation,紋理操作,根據(jù)像素的紋理坐標(biāo),查詢對(duì)應(yīng)的紋理值;(3)Blending,通常稱為alpha blending,根據(jù)目前已經(jīng)畫好的顏色,與正在計(jì)算的顏色的alpha值混合,形成新的顏色。(4)Filtering,將正在計(jì)算的顏色經(jīng)過(guò)某種濾鏡后輸出。該階段之后,像素的顏色值被寫入幀
11、緩存中。-學(xué)習(xí)著色器,并理解著色器的工作機(jī)制,就要對(duì)OpenGL的固定功能管線有深入的了解。首先要知道幾個(gè)OpenGL的術(shù)語(yǔ)渲染(rendering):計(jì)算機(jī)根據(jù)模型(model)創(chuàng)建圖像的過(guò)程。模型(model):根據(jù)幾何圖元?jiǎng)?chuàng)建的物體(object)。幾何圖元:包括點(diǎn)、直線和多邊形等,它是通過(guò)頂點(diǎn)(vertex)指定的。最終完成了渲染的圖像是由在屏幕上繪制的像素組成的。在內(nèi)存中,和像素有關(guān)的信息(如像素的顏色)組織成位平面的形式,位平面是一塊內(nèi)存區(qū)域,保存了屏幕上每個(gè)像素的一個(gè)位的信息。例如,它指定了一個(gè)特定像素的顏色中紅色成分的強(qiáng)度。位平面又可以組織成幀緩沖區(qū)(framebuffer)的
12、形式,后者保存了圖形硬件為了控制屏幕上所有像素的顏色和強(qiáng)度所需要的全部信息。OpenGL的固定功能管線理清了基本的概念,下面了解了一些關(guān)于OpenGL渲染管線的知識(shí).看了這個(gè)之后對(duì)于OpenGL的學(xué)習(xí)我想應(yīng)當(dāng)是很有幫助.關(guān)于這么一篇的原文則是GLSL-LIGHTSOURCE 教程一個(gè)開(kāi)篇部分.點(diǎn)擊這里訪問(wèn)原文。原文是英文的,以下是中文的翻譯,點(diǎn)擊訪問(wèn)下文的原文地址。關(guān)于渲染管線將什么呢?無(wú)非就是在OpenGL的管道當(dāng)中各個(gè)部分的功能以及如何在管道當(dāng)中形成了我們想要的最終的一幅圖.(像素).而管線當(dāng)中的操作可分為以下幾個(gè)部分:階段1. 指定幾何對(duì)象.如:點(diǎn)線 三角形.等一些幾何圖元.OpenGL
13、繪制幾何圖元的方法有以下三種: 一次一個(gè)頂點(diǎn).即使用glBegin() glVertex() glEnd() 指定幾何對(duì)象. 使用頂點(diǎn)數(shù)組.如glDrawArrays.glDrawElements.等.一次性的繪制大量圖元.上面這兩種模式則是立即模式.即指定完圖元之后會(huì)被立即渲染.即將所有數(shù)據(jù)發(fā)往渲染管線后立即被渲染. 顯示列表模式.它存儲(chǔ)于OpenGL服務(wù)端 (接收OpenGL命令的一端),操作函數(shù)有 glNewList、 glEndList、 glCallList .階段2 頂點(diǎn)處理操作:不管以上的幾何對(duì)象是如何指定的,所有的幾何數(shù)據(jù)都將會(huì)經(jīng)過(guò)這個(gè)階段,這個(gè)階段負(fù)責(zé)的則是逐個(gè)頂點(diǎn)的操作.在
14、這個(gè)階段能做的工作則是:1. 頂點(diǎn)變換:根據(jù)模型視圖和投影矩陣變換2. 光照計(jì)算和法線變換(法線矩陣 是模型矩陣的左上角3*3的逆矩陣)和法線規(guī)格化3. 紋理坐標(biāo)變換.(紋理矩陣)4. 材質(zhì)狀態(tài):紋理坐標(biāo)生成而最重要的則是變換以及光照. 每個(gè)頂點(diǎn)在這個(gè)階段分別是單獨(dú)處理的.這個(gè)階段所接收到的數(shù)據(jù)則是每個(gè)頂點(diǎn)的屬性特征.輸出則是變換后的頂點(diǎn)數(shù)據(jù).階段3 圖元組裝在頂點(diǎn)處理之后,頂點(diǎn)的全部屬性都已經(jīng)被確定。在這個(gè)階段頂點(diǎn)將會(huì)根據(jù)應(yīng)用程序送往的圖元規(guī)則如GL_POINTS 、GL_TRIANGLES 等將會(huì)被組裝成圖元。階段4 圖元處理(裁剪 消隱) 這個(gè)步驟第一個(gè)所做的應(yīng)當(dāng)是裁剪操作,會(huì)將圖元與用
15、戶定義的裁剪平面,即glClipPlane 和模型投影矩陣所建立的視景比較. 這將會(huì)裁剪且丟棄位于視景和裁剪平面外部的圖元.不在予以處理. 其次.若是采用透視投影 那么.將會(huì)對(duì)每個(gè)頂點(diǎn)的x,y z坐標(biāo)分別除以w. 緊接著,則是由視口變換將頂點(diǎn)坐標(biāo)變換至窗口坐標(biāo). 執(zhí)行消隱操作階段5 柵格化操作 由圖元處理傳遞過(guò)來(lái)的圖元數(shù)據(jù).在此將會(huì)被分解成更小的單元并對(duì)應(yīng)幀緩沖區(qū)的各個(gè)像素.這些單元被稱之為片元. 一個(gè)片元可能包含窗口左邊、深度、顏色、紋理坐標(biāo)等屬性. 片元的屬性則是圖元上頂點(diǎn)數(shù)據(jù)等經(jīng)過(guò)插值而確定的.這里生成的片元將會(huì)包含主顏色和次顏色. glShadeMode() 函數(shù)的作用將會(huì)這里體現(xiàn).即
16、使用插值(平滑著色) 或者使用最后一個(gè)頂點(diǎn)顏色(平面著色) 點(diǎn)寬 線寬.多邊形模式,正面背面等一些特征也將是這階段發(fā)生作用. 反走樣也是這個(gè)階段起作用.階段6 片元處理 上紋理:通過(guò)紋理坐標(biāo)取得紋理內(nèi)存中相對(duì)應(yīng)的顏色。 霧化:通過(guò)片元距離當(dāng)前視點(diǎn)位置修改顏色. 顏色匯總.這個(gè)與混合完全不同概念.將紋理,主定義的顏色,霧化的顏色,次顏色光照階段計(jì)算的顏色 匯總一起.階段7 逐個(gè)片元的操作 所有的一些測(cè)試 像素所有權(quán) 剪切(glScissor) Alpha測(cè)試(glAlphaFunc)模版測(cè)試(glStencilFunc)深度測(cè)試 (glDephtFunc) 混合(glBlendFunc)這些操作
17、將會(huì)最后影響其在幀緩沖區(qū)的顏色值.階段8 幀緩沖操作 這個(gè)階段執(zhí)行幀緩沖的寫入等操作等.最后產(chǎn)生了顯示出來(lái)的像素.glColorMask、glStrncilMask、glDepthMask、glClearDepht、glClearStencil、glClearColor 等.將在這個(gè)階段影響寫入的值.以上只是討論OpenGL 圖元繪制的基本過(guò)程 那么基于像素圖像繪制.幾乎形同之上.只是在光柵化處理前的操作不一樣.即經(jīng)過(guò)像素解碼 像素傳輸.柵格化 最后形成片元.片元之后的處理完全一樣.可編程管線可以替換的功能在著色器編程領(lǐng)域.你將可實(shí)現(xiàn) Vertex Shader(頂點(diǎn)著色器) 替換 頂點(diǎn)處理階
18、段 Fragment Shader(片元著色器,又叫像素著色器) 替換 片元處理階段 Geometry Shader(幾何著色器) 替換 圖元組裝階段.因?yàn)檫@三個(gè)階段所決定都是最重要效果的階段.對(duì)于這些的可編程將帶來(lái)非常大的好處以及可控制的渲染!在前面的固定功能管線提到了,在階段5:柵格化操作 過(guò)程中,片元的屬性會(huì)由圖元上頂點(diǎn)數(shù)據(jù)等經(jīng)過(guò)插值而確定。在頂點(diǎn)著色器處理完畢后,OpenGL都會(huì)將頂點(diǎn)與頂點(diǎn)之間的片元(基本上可以理解為像素)的屬性(如位置坐標(biāo)、紋理坐標(biāo))進(jìn)行線性插值。所以,在紋理坐標(biāo)為(1,0)和(0,0)中間的片元會(huì)得到一個(gè)(0.5,0)的紋理坐標(biāo),在紋理坐標(biāo)為(0,0)和(1,1)
19、之間的片元會(huì)得到一個(gè)(0.5,0.5)的紋理坐標(biāo)。然后將這些經(jīng)過(guò)差值處理之后的片元交給片元著色器處理。片元著色器確定最終的片元顏色。- 渲染管線過(guò)程: 3D 物體經(jīng)過(guò)一系列的變化(過(guò)程),最終顯示在玩家的眼簾的過(guò)程。 3d(面片),3D Object ,經(jīng)過(guò)一系列復(fù)雜的過(guò)程,這個(gè)過(guò)程硬件變化是看不到的 輸入的是一個(gè)面片,輸出的是一個(gè)形狀 貼圖:要分uv,要對(duì)uv做紋理坐標(biāo)的映射。 拿到美術(shù)資源,有貼圖,是錯(cuò)覺(jué) ,美術(shù)為了便于設(shè)計(jì),在制作時(shí)候是有貼圖,分uv,及映射, 提交給引擎是圖片和模型是分離的,還有一個(gè)材質(zhì)球是索引所有圖片的,材質(zhì)球里面帶有參數(shù)。 黑盒里面包含的步驟: 頂點(diǎn)處理: 通過(guò)一系列的坐標(biāo)系轉(zhuǎn)換,講模型的頂點(diǎn)在攝像機(jī)前進(jìn)行位移,并最終投影到攝像機(jī)的投影屏幕上。 本地坐標(biāo) 世界坐標(biāo)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州競(jìng)賽數(shù)學(xué)試卷
- 華師四校聯(lián)考數(shù)學(xué)試卷
- 防沙治沙工程招商引資報(bào)告(參考)
- 傳染病防控大樓建設(shè)項(xiàng)目實(shí)施方案(范文模板)
- VOCs治理智慧監(jiān)管的策略及實(shí)施路徑
- 診所醫(yī)療廢物儲(chǔ)存與運(yùn)輸安全要求
- 游客隱私保護(hù)策略-洞察及研究
- 2025年醫(yī)學(xué)高級(jí)職稱-中西醫(yī)結(jié)合內(nèi)科(醫(yī)學(xué)高級(jí))歷年參考題庫(kù)含答案解析(5卷單項(xiàng)選擇題100題)
- 2025年住院醫(yī)師規(guī)范培訓(xùn)(各省)-重慶住院醫(yī)師內(nèi)科歷年參考題庫(kù)含答案解析(5卷單選100題)
- 2025年住院醫(yī)師規(guī)范培訓(xùn)(各省)-江蘇住院醫(yī)師腎臟內(nèi)科歷年參考題庫(kù)含答案解析(5卷單選一百題)
- 合并呼吸系統(tǒng)疾患病人手術(shù)的麻醉指南
- 跨學(xué)科實(shí)踐調(diào)研橋梁建筑中的力平衡-滬科版物理八年級(jí)下冊(cè)教學(xué)課件
- 鋼筋工培訓(xùn)課件
- 預(yù)防住院患者非計(jì)劃性拔管的集束化護(hù)理措施課件
- 云南省保山市2024-2025學(xué)年高一上學(xué)期期末考試 地理 含解析
- (高清版)DB11∕T2274-2024水務(wù)工程施工現(xiàn)場(chǎng)安全生產(chǎn)管理導(dǎo)則
- ISO 37001-2025 反賄賂管理體系要求及使用指南(中文版-雷澤佳譯-2025)
- GB/T 45133-2025氣體分析混合氣體組成的測(cè)定基于單點(diǎn)和兩點(diǎn)校準(zhǔn)的比較法
- 2025年1月國(guó)家開(kāi)放大學(xué)行管??啤缎姓M織學(xué)》期末紙質(zhì)考試試題及答案
- 《種衣劑知識(shí)培訓(xùn)》課件
- 經(jīng)典名方小陷胸湯的古今文獻(xiàn)考證
評(píng)論
0/150
提交評(píng)論