日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

使用opengl编程实现一个三维渲染实体_Unity Shader学习随记_01_渲染流水线

發(fā)布時間:2025/3/20 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用opengl编程实现一个三维渲染实体_Unity Shader学习随记_01_渲染流水线 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是Shader?它和Material(材質(zhì))的關(guān)系

Shader,中文翻譯:著色器,是可編程圖形管線的算法片段

Shader實際上就是一小段程序,它負(fù)責(zé)將輸入的頂點數(shù)據(jù)以指定的方式和輸入的貼圖或者顏色等組合起來,然后輸出。繪圖單元可以依據(jù)這個輸出來將圖像繪制到屏幕上。輸入的貼圖或者顏色等,加上對應(yīng)的Shader,以及對Shader的特定的參數(shù)設(shè)置,將這些內(nèi)容打包儲存在一起,得到的就是一個Material(材質(zhì))。之后,我們便可以將材質(zhì)賦予三維物體來進(jìn)行渲染(輸出)了。

Material(材質(zhì))包含Texture Mapping(貼圖),Texture Mapping(貼圖)包含紋理 Texture。紋理是最基本的數(shù)據(jù)輸入單位,游戲領(lǐng)域基本上都用的是位圖。此外還有程序化生成的紋理 Procedural Texture。貼圖的英語 Map 其實包含了另一層含義就是“映射”。其功能就是把紋理通過 UV 坐標(biāo)映射到3D 物體表面。貼圖包含了除了紋理以外其他很多信息,比方說 UV 坐標(biāo)、貼圖輸入輸出控制等等。

材質(zhì)是一個數(shù)據(jù)集,主要功能就是給渲染器提供數(shù)據(jù)和光照算法。貼圖就是其中數(shù)據(jù)的一部分,根據(jù)用途不同,貼圖也會被分成不同的類型,比方說 Diffuse Map,Specular Map,Normal Map 和 Gloss Map 等等。另外一個重要部分就是光照模型 Shader ,用以實現(xiàn)不同的渲染效果。

材質(zhì)好比引擎最終使用的商品,Shader好比是生產(chǎn)這種商品的加工方法,而貼圖就是原材料。


渲染流水線

渲染流水線的概念:渲染流程(Shader只是渲染流水線中的一個可編程算法片段)。主要就是將流程中各階段階段的輸出,輸入到下一階段進(jìn)行工作并輸出到下一階段。例如,片段著色器會將在頂點著色器內(nèi)進(jìn)行了坐標(biāo)變換的頂點數(shù)據(jù)輸入進(jìn)來拓展成多邊形

渲染流水線的工作任務(wù)在于由一個三維場景出發(fā)、生成(或者說渲染)一張二維圖像。換句話說,計算機(jī)需要從一系列的頂點數(shù)據(jù)、紋理等信息出發(fā),把這些信息最終轉(zhuǎn)換成一張人眼可以看到的圖像。

《Real-Time Rendering,Third Edition》書中將整個渲染流程分成3個階段:應(yīng)用階段(Application Stage)、幾何階段(Geometry Stage)、光柵化階段(Rasterizer Stage)

應(yīng)用階段(Application Stage):由應(yīng)用主導(dǎo),通常由CPU負(fù)責(zé)實現(xiàn)

渲染流水線的起始點是CPU,即應(yīng)用階段。應(yīng)用階段大致可分為下面三個階段:

1、把數(shù)據(jù)加載到顯存中

2、設(shè)置渲染狀態(tài)

3、調(diào)用Draw Call

這一階段最重要的輸出是渲染所需的幾何信息,即渲染圖元(rendering primitives)

通俗來講, 渲染圖元可以是點、線、三角面等。這些渲染圖元將會被傳遞給下一個階段——幾何階段。

1、把數(shù)據(jù)加載到顯存中。(場景數(shù)據(jù),粗粒度剔除......)

渲染所需的數(shù)據(jù)都要從硬盤加載到系統(tǒng)內(nèi)存,然后網(wǎng)格和紋理等數(shù)據(jù)又被加載到顯存。

2、設(shè)置渲染狀態(tài)

定義了場景中的網(wǎng)格是怎么被渲染的 (使用哪個shader ,材質(zhì),光源屬性等)

3、調(diào)用Draw Call

Draw Call就是一個命令。他的發(fā)起方是CPU,接收方是GPU。

這個命令僅僅會指向一個需要被渲染的圖元列表,而且不會再包含任何材質(zhì)信息,上個階段已經(jīng)完成了。

給定一個Draw Call后GPU根據(jù)渲染狀態(tài),如材質(zhì)紋理著色器等和所有輸入的頂點數(shù)據(jù)來進(jìn)行計算,最終輸出成屏幕上顯示的像素。

Draw Call這個概念在游戲中可以經(jīng)常聽到,它有很多別名,DP,批次,說的都是它,都是一會事情。在游戲中經(jīng)常出現(xiàn)批次很多的性能問題。

舉個例子:場景中有兩個桶,如果是分別導(dǎo)入的,就是兩個Draw Call。如果是合并之后導(dǎo)入的,就是一個Draw Call。

批次太多會導(dǎo)致CPU性能開銷過大,一般來說有兩種解決辦法。

(1)合批,就是把能合并的都合并起來,盡量減少Draw Call。(肯定有不能合并的,比如場景中的一個大樹和主角,還有好多渲染狀態(tài)啊透明啊之類的)

(2)instance,GPU硬件算法。使用與大量需要重復(fù)繪制的模型,比如草地。但是instance是有上限的,并且只能減少Draw Call,對于增加的面數(shù)來說是無解的。

幾何階段(Geometry Stage):這一階段通常在GPU上進(jìn)行。

幾何階段處理所有和我們要繪制的幾何相關(guān)的事情。

例如決定需要繪制的圖元是什么,怎樣繪制它們,在哪里繪制他們。

幾何階段和每個渲染圖元打交道,進(jìn)行逐頂點、逐多邊形的操作。該階段可進(jìn)一步被分解為更小的流水線階段。

幾何階段的另一個重要的任務(wù)是把頂點坐標(biāo)變換道屏幕空間中,再交給光柵器進(jìn)行處理。

這一階段會將輸出屏幕空間的二維頂點坐標(biāo)、每個頂點對應(yīng)的深度值、著色等相關(guān)信息傳遞給下個階段。

頂點著色——>投影——>裁剪——>屏幕映射

·頂點著色

1、通過坐標(biāo)轉(zhuǎn)換,從模型空間轉(zhuǎn)換到齊次裁剪空間

首先頂點著色階段拿到的頂點坐標(biāo)數(shù)據(jù)都是位于模型空間的,要經(jīng)過模型轉(zhuǎn)換將這些坐標(biāo)數(shù)據(jù)轉(zhuǎn)換到世界空間。接著為了方便后面的投影和裁剪,需要將坐標(biāo)數(shù)據(jù)從世界空間轉(zhuǎn)換到攝像機(jī)空間(攝像機(jī)位置為原點,x軸指向右方,y指向上方,z軸是背離攝像機(jī)朝向的方向),這稱為視圖轉(zhuǎn)換。

視點變換對相機(jī)和模型對影響

2、確定模型上頂點處材質(zhì)的光照效果。將模型頂點的位置變換到齊次裁剪坐標(biāo)系下,進(jìn)行輸出后再由硬件做透視排除法得到歸一化(NDC)的設(shè)備坐標(biāo)。

  • 投影

主要使用兩種投影方法:正交投影、透視投影

正交投影(左),透視投影(右)

為了最大化控制性能消耗,需要將那些不在攝像機(jī)范圍內(nèi)或是被遮擋的物體裁剪掉,不被渲染。這一階段也是將模型從三維空間投影二維空間的過程。

模型空間——>攝像機(jī)空間——>歸一化坐標(biāo)——>0-1之外的部分裁減掉

  • 屏幕映射

通過投影變換,將單位立方體內(nèi)的圖元映射出來

這一階段最主要是將三維坐標(biāo)系(x,y,z)下的每個幾何圖元坐標(biāo)轉(zhuǎn)換到二維(x,y)屏幕空間。

又一個需要引起注意的地方是,OpenGL和DirectX的屏幕坐標(biāo)系之間存在著差異,OpenGL把屏幕的左下角當(dāng)成最小的窗口坐標(biāo)值,而DirectX則定義了屏幕的左上角位最小的窗口坐標(biāo)值。

光柵化階段(Rasterizer Stage):這一階段在GPU上運(yùn)行

這一階段會使用上一階段傳遞的數(shù)據(jù)來產(chǎn)生屏幕上的像素,然后渲染出最終的圖像。

光柵化階段的任務(wù)主要是決定每個渲染圖元中的那些像素應(yīng)該被繪制在屏幕上。

他需要對上階段的到的逐頂點數(shù)據(jù)進(jìn)行插值,然后再進(jìn)行逐像素處理。

與幾何階段類似,光柵化階段又可以分為更小的流水線階段:三角形設(shè)置、三角形遍歷、片元著色器、逐片元操作

總結(jié)

以上是生活随笔為你收集整理的使用opengl编程实现一个三维渲染实体_Unity Shader学习随记_01_渲染流水线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。