一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

實(shí)時(shí)渲染中幾種 Rendering Path 的技術(shù)基礎(chǔ)

Dbwd_Imgtec ? 來源:未知 ? 作者:李倩 ? 2018-03-15 10:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. rendering path 的技術(shù)基礎(chǔ)

在介紹各種光照渲染方式之前,首先必須介紹一下現(xiàn)代的圖形渲染管線。這是下面提到的幾種 Rendering Path 的技術(shù)基礎(chǔ)。

目前主流的游戲和圖形渲染引擎,包括底層的 API(如 DirectX 和 OpenGL)都開始支持現(xiàn)代的圖形渲染管線?,F(xiàn)代的渲染管線也稱為可編程管線(Programmable Pipeline),簡(jiǎn)單點(diǎn)說就是將以前固定管線寫死的部分(比如頂點(diǎn)的處理,像素顏色的處理等等)變成在 GPU上可以進(jìn)行用戶自定義編程的部分,好處就是用戶可以自由發(fā)揮的空間增大,缺點(diǎn)就是必須用戶自己實(shí)現(xiàn)很多功能。

下面簡(jiǎn)單介紹下可編程管線的流程。以 OpenGL 繪制一個(gè)三角形舉例。首先用戶指定三個(gè)頂點(diǎn)傳給 Vertex Shader。然后用戶可以選擇是否進(jìn)行 Tessellation Shader(曲面細(xì)分可能會(huì)用到)和 Geometry Shader(可以在 GPU 上增刪幾何信息)。緊接著進(jìn)行光柵化,再將光柵化后的結(jié)果傳給 Fragment Shader 進(jìn)行 pixel 級(jí)別的處理。最后將處理的像素傳給FrameBuffer 并顯示到屏幕上。

2. 幾種常用的 Rendering Path

Rendering Path 其實(shí)指的就是渲染場(chǎng)景中光照的方式。由于場(chǎng)景中的光源可能很多,甚至是動(dòng)態(tài)的光源。所以怎么在速度和效果上達(dá)到一個(gè)最好的結(jié)果確實(shí)很困難。以當(dāng)今的顯卡發(fā)展為契機(jī),人們才衍生出了這么多的 Rendering Path 來處理各種光照。

2.1 Forward Rendering

Forward Rendering 是絕大數(shù)引擎都含有的一種渲染方式。要使用 Forward Rendering,一般在 Vertex Shader 或 Fragment Shader 階段對(duì)每個(gè)頂點(diǎn)或每個(gè)像素進(jìn)行光照計(jì)算,并且是對(duì)每個(gè)光源進(jìn)行計(jì)算產(chǎn)生最終結(jié)果。下面是 Forward Rendering 的核心偽代碼。

比如在 Unity3D 4.x 引擎中,對(duì)于下圖中的圓圈(表示一個(gè) Geometry),進(jìn)行 Forward Rendering 處理。

將得到下面的處理結(jié)果

也就是說,對(duì)于 ABCD 四個(gè)光源我們?cè)?Fragment Shader 中我們對(duì)每個(gè) pixel 處理光照,對(duì)于 DEFG 光源我們?cè)?Vertex Shader 中對(duì)每個(gè) vertex 處理光照,而對(duì)于 GH 光源,我們采用球調(diào)和(SH)函數(shù)進(jìn)行處理。

Forward Rendering 優(yōu)缺點(diǎn)

很明顯,對(duì)于 Forward Rendering,光源數(shù)量對(duì)計(jì)算復(fù)雜度影響巨大,所以比較適合戶外這種光源較少的場(chǎng)景(一般只有太陽光)。

但是對(duì)于多光源,我們使用 Forward Rendering 的效率會(huì)極其低下。因?yàn)槿绻?vertex shader 中計(jì)算光照,其復(fù)雜度將是O(num_geometry_vertexes ? num_lights),而如果在fragment shader 中計(jì)算光照,其復(fù)雜度為O(num_geometry_fragments ? num_lights) ??梢姽庠磾?shù)目和復(fù)雜度是成線性增長(zhǎng)的。

對(duì)此,我們需要進(jìn)行必要的優(yōu)化。比如

1、多在 vertex shader 中進(jìn)行光照處理,因?yàn)橛幸粋€(gè)幾何體有 10000 個(gè)頂點(diǎn),那么對(duì)于 n 個(gè)光源,至少要在 vertex shader 中計(jì)算 10000n 次。而對(duì)于在 fragment shader 中進(jìn)行處理,這種消耗會(huì)更多,因?yàn)閷?duì)于一個(gè)普通的 1024x768 屏幕,將近有 8 百萬的像素要處理。所以如果頂點(diǎn)數(shù)小于像素個(gè)數(shù)的話,盡量在 vertex shader 中進(jìn)行光照。

2、如果要在 fragment shader 中處理光照,我們大可不必對(duì)每個(gè)光源進(jìn)行計(jì)算時(shí),把所有像素都對(duì)該光源進(jìn)行處理一次。因?yàn)槊總€(gè)光源都有其自己的作用區(qū)域。比如點(diǎn)光源的作用區(qū)域是一個(gè)球體,而平行光的作用區(qū)域就是整個(gè)空間了。對(duì)于不在此光照作用區(qū)域的像素就不進(jìn)行處理。但是這樣做的話,CPU 端的負(fù)擔(dān)將加重。

3、對(duì)于某個(gè)幾何體,光源對(duì)其作用的程度是不同,所以有些作用程度特別小的光源可以不進(jìn)行考慮。典型的例子就是 Unity 中只考慮重要程度最大的 4 個(gè)光源。

2.2 Deferred Rendering

Deferred Rendering(延遲渲染)顧名思義,就是將光照處理這一步驟延遲一段時(shí)間再處理。具體做法就是將光照放在已經(jīng)將三維物體生成二維圖片之后進(jìn)行處理。也就是說將物空間的光照處理放到了像空間進(jìn)行處理。要做到這一步,需要一個(gè)重要的輔助工具——G-Buffer。G-Buffer 主要是用來存儲(chǔ)每個(gè)像素對(duì)應(yīng)的 Position,Normal,Diffuse Color 和其他 Material parameters。根據(jù)這些信息,我們就可以在像空間中對(duì)每個(gè)像素進(jìn)行光照處理[3]。下面是Deferred Rendering 的核心偽代碼。

下面簡(jiǎn)單舉個(gè)例子。

首先我們用存儲(chǔ)各種信息的紋理圖。比如下面這張 Depth Buffer,主要是用來確定該像素距離視點(diǎn)的遠(yuǎn)近的。

根據(jù)反射光的密度/強(qiáng)度分度圖來計(jì)算反射效果。

下圖表示法向數(shù)據(jù),這個(gè)很關(guān)鍵。進(jìn)行光照計(jì)算最重要的一組數(shù)據(jù)。

下圖使用了 Diffuse Color Buffer。

這是使用 Deferred Rendering 最終的結(jié)果。

Deferred Rendering 的最大的優(yōu)勢(shì)就是將光源的數(shù)目和場(chǎng)景中物體的數(shù)目在復(fù)雜度層面上完全分開。也就是說場(chǎng)景中不管是一個(gè)三角形還是一百萬個(gè)三角形,最后的復(fù)雜度不會(huì)隨光源數(shù)目變化而產(chǎn)生巨大變化。從上面的偽代碼可以看出 deferred rendering 的復(fù)雜度為O(screen_resolution + num_lights)。

但是 Deferred Rendering 局限性也是顯而易見。比如我在 G-Buffer 存儲(chǔ)以下數(shù)據(jù)

這樣的話,對(duì)于一個(gè)普通的 1024x768 的屏幕分辨率??偣驳檬褂?1024x768x128bit=20MB,對(duì)于目前的動(dòng)則上 GB 的顯卡內(nèi)存,可能不算什么。但是使用 G-Buffer 耗費(fèi)的顯存還是很多的。一方面,對(duì)于低端顯卡,這么大的顯卡內(nèi)存確實(shí)很耗費(fèi)資源。另一方面,如果要渲染更酷的特效,使用的 G-Buffer 大小將增加,并且其增加的幅度也是很可觀的。順帶說一句,存取 G-Buffer 耗費(fèi)的帶寬也是一個(gè)不可忽視的缺陷。

對(duì)于 Deferred Rendering 的優(yōu)化也是一個(gè)很有挑戰(zhàn)的問題。下面簡(jiǎn)單介紹幾種降低Deferred Rendering 存取帶寬的方式。最簡(jiǎn)單也是最容易想到的就是將存取的 G-Buffer 數(shù)據(jù)結(jié)構(gòu)最小化,這也就衍生除了 light pre-pass 方法。另一種方式是將多個(gè)光照組成一組,然后一起處理,這種方法衍生了 Tile-based deferred Rendering。

2.2.1 Light Pre-Pass

Light Pre-Pass 最早是由 Wolfgang Engel 在他的博客[2]中提到的。

具體的做法是:

(1)只在G-Buffer 中存儲(chǔ) Z 值和 Normal 值。對(duì)比 Deferred Render,少了 Diffuse Color, Specular Color 以及對(duì)應(yīng)位置的材質(zhì)索引值。

(2)在 FS 階段利用上面的 G-Buffer 計(jì)算出所必須的 light properties,比如 Normal*LightDir,LightColor,Specular 等 light properties。將這些計(jì)算出的光照進(jìn)行 alpha-blend 并存入 LightBuffer(就是用來存儲(chǔ) light properties 的 buffer)。

(3)最后將結(jié)果送到 forward rendering 渲染方式計(jì)算最后的光照效果。

相對(duì)于傳統(tǒng)的 Deferred Render,使用 Light Pre-Pass 可以對(duì)每個(gè)不同的幾何體使用不同的 shader 進(jìn)行渲染,所以每個(gè)物體的 material properties 將有更多變化。這里我們可以看出對(duì)于傳統(tǒng)的 Deferred Render,它的第二步(見偽代碼)是遍歷每個(gè)光源,這樣就增加了光源設(shè)置的靈活性,而 Light Pre-Pass 第三步使用的其實(shí)是 forward rendering,所以可以對(duì)每個(gè)mesh 設(shè)置其材質(zhì),這兩者是相輔相成的,有利有弊。另一個(gè) Light Pre-Pass 的優(yōu)點(diǎn)是在使用MSAA 上很有利。雖然并不是 100%使用上了 MSAA(除非使用 DX10/11 的特性),但是由于使用了 Z 值和 Normal 值,就可以很容易找到邊緣,并進(jìn)行采樣。

下面這兩張圖,左邊是使用傳統(tǒng) Deferred Render 繪制的,走遍是使用 Light Pre-Pass 繪制的。這兩張圖在效果上不應(yīng)該有太大區(qū)別。

2.2.2 Tile-Based Deferred Rendering

TBDR 主要思想就是將屏幕分成一個(gè)個(gè)小塊 tile。然后根據(jù)這些 Depth 求得每個(gè) tile 的bounding box。對(duì)每個(gè) tile 的 bounding box 和 light 進(jìn)行求交,這樣就得到了對(duì)該 tile 有作用的 light 的序列。最后根據(jù)得到的序列計(jì)算所在 tile 的光照效果。

對(duì)比 Deferred Render,之前是對(duì)每個(gè)光源求取其作用區(qū)域 light volume,然后決定其作用的的 pixel,也就是說每個(gè)光源要求取一次。而使用 TBDR,只要遍歷每個(gè) pixel,讓其所屬tile 與光線求交,來計(jì)算作用其上的 light,并利用 G-Buffer 進(jìn)行 Shading。一方面這樣做減少了所需考慮的光源個(gè)數(shù),另一方面與傳統(tǒng)的 Deferred Rendering 相比,減少了存取的帶寬。

2.3 Forward+

Forward+ == Forward + Light Culling[6]。Forward+很類似 Tiled-based Deferred Rendering。其具體做法就是先對(duì)輸入的場(chǎng)景進(jìn)行 z-prepass,也就是說關(guān)閉寫入 color,只向 z-buffer 寫入 z 值。注意此步驟是 Forward+必須的,而其他渲染方式是可選的。接下來來的步驟和 TBDR 很類似,都是劃分 tiles,并計(jì)算 bounding box。只不過 TBDR 是在 G-Buffer 中完成這一步驟的,而 Forward+是根據(jù) Z-Buffer。最后一步其實(shí)使用的是 forward 方式,即在 FS 階段對(duì)每個(gè)pixel 根據(jù)其所在 tile 的 light 序列計(jì)算光照效果。而 TBDR 使用的是基于 G-Buffer 的 deferred rendering。

實(shí)際上,forward+比 deferred 運(yùn)行的更快。我們可以看出由于 Forward+只要寫深度緩存就可以,而 Deferred Render 除了深度緩存,還要寫入法向緩存。而在 Light Culling 步驟,F(xiàn)orward+只需要計(jì)算出哪些 light 對(duì)該 tile 有影響即可。而 Deferred Render 還在這一部分把光照處理給做了。而這一部分,F(xiàn)orward+是放在 Shading 階段做的。所以 Shading階段 Forward+耗費(fèi)更多時(shí)間。但是對(duì)目前硬件來說,Shading 耗費(fèi)的時(shí)間沒有那么多。

Forward+的優(yōu)勢(shì)還有很多,其實(shí)大多就是傳統(tǒng) Forward Rendering 本身的優(yōu)勢(shì),所以Forward+更像一個(gè)集各種 Rendering Path 優(yōu)勢(shì)于一體的 Rendering Path。

3. 總結(jié)

首先我們列出 Rendering Equation,然后對(duì)比 Forward Rendering,Deferred Rendering 和Forward+ Rendering。

3.1 Rendering Equation

其中點(diǎn) x 處有一入射光,其光強(qiáng)為L(zhǎng)e,入射角度為 wi。根據(jù)函數(shù) f 和 Le來計(jì)算出射角為 wo)。注意此處的 n 為場(chǎng)景中總共有 n 個(gè)光源。

3.2 Forward Renderng

由于 Forward 本身對(duì)多光源支持力度不高,所以此處對(duì)于每個(gè)點(diǎn) x 的處理不再考慮所有的 n 個(gè)光源,僅僅考慮少量的或者說經(jīng)過挑選的 m 個(gè)光源??梢钥闯鲞@樣的光照效果并不完美。另外,每個(gè)光線的V'(wo)是計(jì)算不了的。

3.3 Deferred Rendering

由于 Deferred Rendering 使用了 light culling,所以不用遍歷場(chǎng)景中的所有光源,只需遍歷經(jīng)過 light culling 后的 n 個(gè)光源即可。并且 Deferred Rendering 將計(jì)算 BxDF 的部分單獨(dú)分出來了。

3.4 Forward+ Rendering

可以看出 Forward+和 Forward 最大區(qū)別就是光源的挑選上有了很到改進(jìn)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 光源
    +關(guān)注

    關(guān)注

    3

    文章

    744

    瀏覽量

    69935
  • 光照
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    11220

原文標(biāo)題:實(shí)時(shí)渲染中常用的幾種 Rendering Path

文章出處:【微信號(hào):Imgtec,微信公眾號(hào):Imagination Tech】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【RTC程序設(shè)計(jì):實(shí)時(shí)音視頻權(quán)威指南】視頻采集與渲染

    屏幕等等,這些都是顯示器件。人眼觀察的最低要求一般是60赫茲,渲染的過快,會(huì)使人眼無法分辨過低,則會(huì)出現(xiàn)閃爍和不流暢。在2000年以來渲染技術(shù)主要是實(shí)時(shí)
    發(fā)表于 04-25 08:40

    【RTC程序設(shè)計(jì):實(shí)時(shí)音視頻權(quán)威指南】音頻采集與渲染

    在進(jìn)行視頻的采集與渲染的同時(shí),我們還需要對(duì)音頻進(jìn)行實(shí)時(shí)的采集和渲染。對(duì)于rtc來說,音頻的實(shí)時(shí)性和流暢性更加重要。 聲音是由于物體在空氣
    發(fā)表于 04-28 21:00

    如何為GRID渲染設(shè)置適當(dāng)?shù)腦org.conf ?

    大家好?我們正在嘗試為我們的OpenGL應(yīng)用程序啟動(dòng)并運(yùn)行GRID實(shí)例, 但必須在設(shè)置遺漏一些東西......如何為GRID渲染設(shè)置適當(dāng)?shù)腦org.conf ???安裝nVidia GRID
    發(fā)表于 09-27 16:03

    Unity的局部立方體圖渲染技術(shù)解讀

    本指南介紹了用于在Unity版本5及更高版本實(shí)現(xiàn)反射的本地立方體貼圖渲染技術(shù)。反射在游戲中很重要,因?yàn)樗鼈兪箤?duì)象看起來很逼真。與舊的渲染技術(shù)
    發(fā)表于 08-02 10:14

    實(shí)時(shí)渲染在高校虛擬仿真教學(xué)應(yīng)用的優(yōu)勢(shì)和價(jià)值分析

    加載到本地,利用本地算力來實(shí)現(xiàn)資源教學(xué),造成知識(shí)產(chǎn)權(quán)難以保護(hù)的問題 ;5、現(xiàn)有機(jī)房環(huán)境、設(shè)備需要更新迭代才能滿足虛擬仿真內(nèi)容的教學(xué)使用。三、實(shí)時(shí)渲染帶來虛擬仿真教學(xué)方式的改革將虛擬仿真實(shí)驗(yàn)內(nèi)容部署在
    發(fā)表于 08-22 14:52

    虛擬現(xiàn)實(shí)應(yīng)用的并行渲染技術(shù)

    虛擬現(xiàn)實(shí)應(yīng)用要求圖形系統(tǒng)具備實(shí)時(shí)渲染復(fù)雜、精細(xì)場(chǎng)景的能力?;赑C 機(jī)群的并行渲染系統(tǒng)具有性價(jià)比高、擴(kuò)展性好的特點(diǎn),適合虛擬現(xiàn)實(shí)應(yīng)用。該文針對(duì)虛擬現(xiàn)實(shí)應(yīng)用設(shè)計(jì)并實(shí)
    發(fā)表于 03-30 09:18 ?30次下載

    基于GPU的水面實(shí)時(shí)渲染算法

    提出基于可編程圖像硬件實(shí)時(shí)生成真實(shí)水面的渲染方法,通過實(shí)現(xiàn)水面建模、水面折射和反射完成整個(gè)渲染過程。在正弦波疊加的同時(shí),利用2個(gè)凹凸紋理實(shí)現(xiàn)水面的動(dòng)畫效果,通過
    發(fā)表于 04-14 08:40 ?18次下載

    研究人員提出通過機(jī)器學(xué)習(xí)管道實(shí)現(xiàn)實(shí)時(shí)CG渲染

    ——新視圖合成 (NVS)。 近日,一篇題為Neural Lumigraph Rendering的研究論文聲稱,它對(duì)現(xiàn)有的2個(gè)數(shù)量級(jí)圖像進(jìn)行了改進(jìn),展示了通過機(jī)器學(xué)習(xí)管道實(shí)現(xiàn)實(shí)時(shí) CG 渲染的幾個(gè)步驟。與以前的方法相比,神經(jīng)光圖
    的頭像 發(fā)表于 05-10 10:19 ?1815次閱讀

    什么是時(shí)序路徑timing path呢?

    今天我們要介紹的時(shí)序分析概念是 **時(shí)序路徑** (Timing Path)。STA軟件是基于timing path來分析timing的。
    的頭像 發(fā)表于 07-05 14:54 ?2782次閱讀
    什么是時(shí)序路徑timing <b class='flag-5'>path</b>呢?

    華為云渲染實(shí)踐

    提到云渲染,大家可能會(huì)直接聯(lián)想到云游戲,實(shí)際上二者并不等同。華為云致力于將渲染技術(shù)應(yīng)用于各個(gè)行業(yè),目前主要包括實(shí)時(shí)渲染和離線
    的頭像 發(fā)表于 08-24 16:46 ?1902次閱讀
    華為云<b class='flag-5'>渲染</b>實(shí)踐

    實(shí)時(shí)渲染部署數(shù)字孿生顯卡要求

    額外的程序,只需點(diǎn)擊即可使用 。 而且,在網(wǎng)絡(luò)條件良好的情況下, 云渲染還能突破時(shí)間和空間的限制 。在之前疫情以來,越來越多的數(shù)字孿生項(xiàng)目業(yè)主都要求項(xiàng)目使用實(shí)時(shí)渲染技術(shù),并支持多種終
    的頭像 發(fā)表于 12-05 17:01 ?1035次閱讀

    揭秘:實(shí)時(shí)渲染、離線渲染、云渲染和混合渲染的區(qū)別

    渲染,就是將3D模型轉(zhuǎn)換成2D圖像,并最終呈現(xiàn)在屏幕上的過程。常見的渲染類型有以下幾種實(shí)時(shí)渲染離線渲染
    的頭像 發(fā)表于 12-26 08:27 ?1309次閱讀
    揭秘:<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>渲染</b>、離線<b class='flag-5'>渲染</b>、云<b class='flag-5'>渲染</b>和混合<b class='flag-5'>渲染</b>的區(qū)別

    探索渲染技術(shù)與云渲染的魅力!

    。一、渲染技術(shù)的基礎(chǔ)原理渲染技術(shù)的核心原理是根據(jù)場(chǎng)景的光照、材質(zhì)和幾何信息,計(jì)算出像素級(jí)別的顏色和亮度。通過這種方式,我們可以在計(jì)算機(jī)屏幕
    的頭像 發(fā)表于 04-12 08:30 ?567次閱讀
    探索<b class='flag-5'>渲染</b><b class='flag-5'>技術(shù)</b>與云<b class='flag-5'>渲染</b>的魅力!

    烘焙vs渲染:3D模型制作的效率與質(zhì)量之爭(zhēng)

    在3D建模和渲染領(lǐng)域,模型烘焙(Baking)和模型渲染Rendering)是兩個(gè)經(jīng)常被提及的概念。盡管它們都與最終圖像的生成有關(guān),但它們?cè)?b class='flag-5'>技術(shù)實(shí)現(xiàn)、目的、優(yōu)勢(shì)和劣勢(shì)等方面存在顯著差
    的頭像 發(fā)表于 05-12 08:27 ?878次閱讀
    烘焙vs<b class='flag-5'>渲染</b>:3D模型制作<b class='flag-5'>中</b>的效率與質(zhì)量之爭(zhēng)

    VIVERSE 推行實(shí)時(shí)3D渲染: 探索Polygon Streaming技術(shù)力量與應(yīng)用

    在商業(yè)領(lǐng)域和娛樂行業(yè),3D渲染技術(shù)一直是推動(dòng)視覺體驗(yàn)革新的關(guān)鍵力量。隨著技術(shù)的進(jìn)步,實(shí)時(shí)3D渲染
    的頭像 發(fā)表于 05-31 15:49 ?2620次閱讀
    VIVERSE 推行<b class='flag-5'>實(shí)時(shí)</b>3D<b class='flag-5'>渲染</b>: 探索Polygon Streaming<b class='flag-5'>技術(shù)</b>力量與應(yīng)用