? ? ? ?在Unity 5中,我們已經(jīng)添加了許多用戶可見的圖形功能(全新的標(biāo)準(zhǔn)shader,實(shí)時(shí)的全局照明,反射探針,全新的光照貼圖工作流等等),但我們也做了渲染的內(nèi)部構(gòu)件。除了典型的像“優(yōu)化它”的功能(例如,多線程光照遮擋剔除處理)和“更具持續(xù)性”的功能(例如,在線性顏色空間和伽馬顏色空間增加更多的一貫性),我們還探討如何使它具有更多的可擴(kuò)展性。
在測試組內(nèi)部,我們已討論過多種方法。提出了許多想法:更多的腳本調(diào)回,整合出更小的“尚待完成的工作列表”的緩沖區(qū),可以從頭開始創(chuàng)建出完全渲染的工作流,并帶有某種渲染構(gòu)建工具功能的視覺樹或圖形。對(duì)于Unity 5而言,我們可能創(chuàng)建出“工作列表”的緩沖區(qū),我們把它稱之為“Command Buffers”。
圖形中的命令緩沖區(qū)表示要執(zhí)行的命令的低級(jí)列表。例如,像Direct3D 或OpenGL一樣的3D渲染API,通常會(huì)結(jié)束創(chuàng)建一個(gè)命令緩沖區(qū),最終由GPU完成。Unity的多線程渲染器也會(huì)在調(diào)回線程和“工作線程”之間創(chuàng)建一個(gè)命令緩沖區(qū),從而提交命令給渲染中的API。
在我們的例子中,與上述想法相似。但“命令”卻是更高的水準(zhǔn)。不采取“內(nèi)部的GPU寄存器,把X值賦值到Y(jié)值上”。取而代之的執(zhí)行命令是“用材料繪制網(wǎng)格”等等。
從你的腳本來看,你能夠創(chuàng)建命令緩沖區(qū),并在其中添加渲染命令(“設(shè)定渲染目標(biāo),繪制網(wǎng)格……”)。隨后,這些命令緩沖區(qū)可以在相機(jī)渲染時(shí)的不同點(diǎn)位處執(zhí)行操作。
例如,所有的常用對(duì)象完成后,你可以渲染一些額外的對(duì)象到延遲渲染的G-buffer中。或者是天空盒拖動(dòng)后,立刻渲染一些云層。再或者是在所有普通燈完成之后,渲染自定義光照(體積光、負(fù)光等等)到延遲渲染燈光緩沖區(qū)中。
在API文檔腳本中,請(qǐng)看CommandBuffer和CameraEvent的界面。http://docs.unity3d.com/500/Documentation/ScriptReference/Rendering.Comm...
好吧,來舉個(gè)例子。我們可以做blurry refractions(模糊反射)。
不透明的物體及天空盒都渲染之后,我們把當(dāng)前圖像復(fù)制到一個(gè)臨時(shí)渲染目標(biāo)上,使其模糊化,然后再設(shè)定全局shader屬性。玻璃對(duì)象上的shader隨后以模糊圖像作為樣本,基于法線貼圖的UV坐標(biāo)偏移量來進(jìn)行模擬反射。這與shader GrabPass does完成的操作類似,除非你能做出更多初始化的操作(在這種情況下是模糊化)。

另一個(gè)用例:custom deferred lights(自定義延遲光照)。下面的圖片是球形燈光效果和試管形狀的燈光效果:

常規(guī)延遲shading光照完成后,每個(gè)自定義光照都繪制出一個(gè)帶有shader的球形,計(jì)算光照并添加它到光照緩沖區(qū)內(nèi)。

我們的想法是:在G-buffer完成之后,為每個(gè)貼花紙(盒子)“形狀”的東西做繪制,并修改G-buffer的內(nèi)容。這與光照如何在延遲shading中的操作如出一轍。除了去疊加光照,我們?nèi)《氖切薷腉-buffer的紋理。

每一個(gè)貼花紙?jiān)诖俗鳛橐粋€(gè)盒子來實(shí)現(xiàn)的,并影響著盒子內(nèi)部的任意幾何體。
實(shí)際上,這里有一個(gè)小的Unity (5.0 beta 22)項(xiàng)目文件夾,它演示了一切內(nèi)容:(請(qǐng)看鏈接:)http://docs.unity3d.com/500/Documentation/ScriptReference/Rendering.Came...。
你能看到所有這些案例實(shí)現(xiàn)起來并不復(fù)雜——腳本只有區(qū)區(qū)幾百行。