1. 程式人生 > >實時渲染(一)——圖形渲染管線

實時渲染(一)——圖形渲染管線

在渲染管線中是最慢的階段決定整個渲染的速度。

我們一般使用吞吐量(throughput)來描述一個階段的處理速度,而不是幀率。因為幀率會受到裝置更新的限制而導致實際速度比幀率所標示的更慢。

一個例子:

假設一個裝置為60赫茲,這意味著這個裝置16.666666ms重新整理一次,這時恰好有一管線階段花費了62.5ms執行完成,由於63大於16.666666*3,小於16.666666*4,所以他實際上想要最終完成工作必須等待下一次裝置重新整理。所以真實的執行時間折算下來其實不止62.5ms而是趨近於66ms。當然,如果關閉了垂直同步就另當別論了。

一個渲染管線可以粗略的按照執行順序分成三大階段:

  1. 應用階段
  2. 幾何階段
  3. 光柵階段

這些階段又可以細分為更多的子階段,注意這些都是功能性的分配,在實現上為了效率等因素往往會合並一些階段或者拆分一些階段等等。

下面是一張圖:

一、應用階段

這個階段的目標就是為幾何階段產生合適的圖元資料,一般來說,很多工作都在這個階段完成,諸如碰撞檢測、動畫、輸入、當然還有一些加速管線的演算法,比如層次視椎剔除(hierarchical view frustum culling)等等。

二、幾何階段

幾何階段集中於逐多邊形操作和逐頂點操作。

  1. 模型-檢視轉換:模型座標-->世界座標-->相機座標
  2. 頂點著色:計算著色方程根據材質資料(位置、法線、顏色、其他著色方程需要的資料等等)決定光照效果,結果可以是(顏色、向量、紋理座標或者其他種類的著色資料)。通常在世界空間中發生、有時候會把相關實體轉換到其他空間,並在此空間進行計算。
  3. 投影:略
  4. 裁剪:在單位立方體之外的基元被捨棄,而完全在單位立方體之內的基元被保留;相交的基元則進行剪下,生成新的頂點,而老的被丟棄。
  5. 螢幕對映:只有已裁剪的部分才會被傳遞給螢幕對映,座標仍然是3維的。將x/y轉換成平面座標。轉換後的x/y叫做螢幕座標。有一個注意事項是:如何把浮點數對映到畫素以及某些系統之間螢幕做座標原點的問題。

三、光柵階段

  1. 建立三角形:計算三角形表面差值等資料,這個資料將會用於下一階段的掃描轉換,以及幾何階段生成的各種著色資料的插值。
  2. 遍歷三角形:檢查每個被三角形覆蓋了中心的畫素,併為何三角形重疊的部分生成片段。查詢那些在三角形之內的畫素或者取樣的過程叫做掃描轉換。生成的每個在三角形內的片段都是根據三角形頂點插值出來的,這些片段的資料包括深度以及各種來自幾何階段的著色資料。
  3. 畫素著色:插值完畢的著色資料輸入其中,執行所有的逐畫素著色操作,並將一個或者多個顏色傳遞給下一個階段。紋理技術也在此階段實現。
  4. 合併:每個畫素的資訊被儲存在顏色緩衝中,它是顏色的矩形陣列(每個顏色擁有紅、綠、藍三部分)。合併階段負責將著色階段生成的片段顏色和當前緩衝中儲存的顏色進行組合。並且包含可見性檢測、模板操作等等。

 最後要梳理一下各種shader通常都做什麼:

vertex shader:模型-檢視轉換,頂點著色,投影

geometry shader:操作圖元頂點(primitive概念看下方)——圖元著色、銷燬/建立圖元

pixel(fragment) shader:畫素著色

幾何primitive: points、lines、triangles

相關推薦

實時渲染——圖形渲染管線

在渲染管線中是最慢的階段決定整個渲染的速度。 我們一般使用吞吐量(throughput)來描述一個階段的處理速度,而不是幀率。因為幀率會受到裝置更新的限制而導致實際速度比幀率所標示的更慢。 一個例子: 假設一個裝置為60赫茲,這意味著這個裝置16.666666ms重新整理一次,這時恰好有一管線階段花費了62

Unity3D的著色器介紹—軟渲染和著色器原理

              由於講圖形渲染這樣的東西比較抽象,而且結合三維數學方面的知識比較多,我自己的理解也不一定正確,所以先試寫一篇看看。如果有什麼意見,請在評論裡指出。           一開始先講些理論性的東西吧。要講著色器,我覺得很有必要先說一下著色器是怎樣

NPR——卡通渲染

NPR——卡通渲染 本文的目的是系統的探討遊戲中的卡通渲染技術,以期深刻掌握卡通渲染中所用技術原理。卡通渲染是一種非真實感的圖形渲染(NPR)技術(所謂真實感圖形渲染是指計算機模擬真實自然的圖形技術,最重要的是 Light & Shadow

Maya場景渲染

這次動畫我主要負責的一部分,就是渲染,渲染可以說是動畫中最初效果的一部分,如何把Maya中生硬的模型打造出光影效果優秀,陰影層次分明的畫面,是渲染所需要完成的工作。特別是對於我們這次的寫實風格的CG動畫來說更是如此,我會用四個模組,來介紹一下四個典型的不同場景是怎麼渲染的。在

【GLSL教程】圖形流水線

這是一些列來自 lighthouse3d 的GLSL教程,非常適合入門。我將邊學習邊翻譯該教程的內容,同時記錄在這裡,方便以後查詢。 流水線概述 下圖描述了一個簡化的圖形處理流水線,雖然簡略但仍然可以展示著色器程式設計(shader programming)的一些重要概念。 一

uCOS-II學習筆記:實時作業系統

1.前後臺系統:前後臺系統的架構用一句話來形容的話,就是一個大的迴圈,加上中斷,就形成了一個整的體系。 假設來了中斷需要處理模組3,如果模組3的處理是最緊迫的,但是當前cpu 只執行到模組1, 這樣的話,必須還要承受模組2的執行時間延遲,才能輪到模組3的處理,當模組越多的

在Unity裡寫一個純手動的渲染管線

隨著Unity3D 2018的面世,Scriptable Rendering Pipeline,也就是可程式設計渲染管線這項新技術變得家喻戶曉。官方在推出這項技術的時候,著重強調了他的各種優點,而筆者總結了一下官方的解釋,認為SRP有以下三個優點:簡單,簡單和簡單。 這第一

學習shader之前必須知道的東西之計算機圖形渲染...

shader到底是幹什麼用的?shader的工作原理是什麼?         其實當我們對這個問題還很懵懂的時候,就已經開始急不可耐的要四處搜尋有關shader的資料,恨不得立刻上手寫一個出來。但看了一些資料甚至看了不少cg的語法之後,我們還是很迷茫,UNITY_MATRIX_MVP到底是個什麼矩陣?它和v

GLSL著色語言的學習渲染管線流程

position是三維,我們變成齊次座標:vec4(position,1.0),齊次座標用4個分量來表示空間中的點,實現了平移,旋轉,縮放的統一(在後續數學回憶章節再講這一偉大發明),也用來區分點(x,y,z,1)和向量(x,y,z,0)。下面我們講一下projectionMatrix*viewMatrix*

三維渲染引擎設計與時間

註冊 三維 特定 渲染引擎 交互 文件 集合 工具 調度 一、初始osg 三維渲染引擎:為了實現三維場景圖形的結構管理和繪制而提供的一系列API的集合。包括構建層和交互層。 Crystal Space、Java3D、Unreal…… osg庫:構件場景圖形的場景圖形節點類、

Unreal渲染模組 管線 - 程式和場景查詢

@author: 白袍小道 檢視隨意,轉載隨緣     第一部分: 這裡主要關心加速演算法,和該階段相關的UE模組的結構和元件的處理。 What-HOW-Why-HOW-What(嘿嘿,老規矩) 1、渲染模組這裡有個主要任務需要完成:將需要在螢幕上(或者某裝置)顯示出來的Prim

文字渲染的那些事字型是如何儲存的?

在現代生活裡,我們幾乎每天都會和螢幕上的文字打交道——文字看起來是如此平凡,以至於不少與 UI 相關的專業人士都對其下的複雜性知之甚少。這個系列旨在以開發者的角度,介紹一些從文字的二進位制資料到畫素之間流程的科普知識,希望對感興趣的同學能有一些啟發。 字型的標準與格式 喜歡折騰系統的同學,對於常見的字型格

Android優化筆記——渲染原理

顯示機制和重新整理機制 Android的顯示系統是一個典型的顯示系統,它由CPU,GPU,Display組成,CPU負責計算資料,把計算好資料交給GPU,GPU會對圖形資料進行渲染,渲染好後放到buffer裡存起來,然後Display負責把buffer裡的

加快首屏渲染速度——抽取critical CSS

核心思路: 一、抽取出首頁需要的css 二、用行內css形式載入這部分css(critical css) 三、等到頁面載入完之後,再載入整個css,會有一部分css與critical css重疊 示例 內嵌關鍵的CSS,具體方法如下: 注意 <link>

Unity3D畫面渲染官方教程對光照和渲染的介紹

專業 得到 ros 復雜 怎樣 span 處理 行為 廣泛 本系列是對官方教程的翻譯加上自己的一些理解譯著的,官方網址:https://unity3d.com/cn/learn/tutorials/s/graphics 翻譯上盡量保證準確性,但不排除省略或者添加一些詞匯幫

D3D11和D3D12多執行緒渲染框架的比較

1. 前言 D3D12伴隨DirectX12自2014年正式釋出以來已經近3年多時間了。遺憾的是我最近才有時間仔細研究D3D12介面及程式設計方面的內容。D3D12給我總體的感覺用一句話來概括就是——D3D12是一個“顯示卡作業系統!”。 得益於我對

步步寫水面渲染

第九步:法線貼圖 為了使海面更加有真實感,我們還要為其新增法線貼圖,使其更具質感。為了保證法線方向的正確性,我們需要引入切線空間,並對於每一個三角面片計算其切線空間中的tangent和bitangent 程式碼如下: void tangentandbi

Vsync垂直同步訊號分發和SurfaceFlinger響應執行渲染流程分析

void SurfaceFlinger::init() { ALOGI( "SurfaceFlinger's main thread ready to run. " "Initializing graphics H/W..."); status_t err;

UGUI學習筆記 渲染層級

1.Unity3D中的渲染順序如下:   不同的Camera的Depth   相同Camera下的不同SortingLayer   相同SortingLayer下的不同Z軸/Order in Layer 2.改變控制元件之間的層級關係  (1)同一canvas下:      改變控制元件transform的S

Unity醬~ 卡通渲染技術分析

前面的話 unitychan是日本unity官方團隊提供的一個Demo,裡面有很好的卡通渲染效果,值得參考學習 上圖是我整理出來的shader結構,可以看到Unity娘被拆分成了很多個小的部件,我想主要是為了掛動態骨骼吧。因為有很多部件的材質,shader其實都是一樣的可以合併成少數幾個 我打算分3個