第十四章 使用雜訊(3)

2021-09-22 10:11:15 字數 3571 閱讀 4693

在前面我們講到了如何使用深度紋理來實現一種基於螢幕後處理的全域性特效。我們由深度紋理重建每個畫素在世界空間下的位置,再使用乙個基於高度的公式來計算霧效的混合係數,最後使用該係數來混合霧的顏色和原螢幕的顏色。這裡實現的效果是乙個基於高度的均勻霧效,即在同乙個高度上,霧的濃度是相同的。如下圖的左圖所示:

然而,一些時候我們希望可以模擬一種不均勻的霧效,同時讓霧不斷飄動,使霧看起來更加縹緲,如上圖右圖所示。這樣就可以通過使用一張雜訊紋理來實現。

本節的實現非常簡單,絕大多數的**和前面一樣,我們只是新增了雜訊相關的引數和屬性,並在shader的片元著色器中對高度的計算新增了雜訊的影響。

指令碼:(1)首先,繼承基類:

public class fogwithnoise : posteffectsbase   

}

(3)在本節中,我們需要獲取攝像機的相關引數,如近裁剪平面的距離、fov等,同時還需要獲取攝像機在世界空間下的前方、上方和右方等方向,因此我們用兩個變數儲存攝像機的camera元件和transform元件:

private camera mycamera;

public camera camera

return mycamera;

} }private transform mycameratransform;

public transform cameratransform

return mycameratransform;

} }

(4)定義模擬霧效時使用的各個引數:

[range(0.1f, 3.0f)]

public float fogdensity = 1.0f;

public color fogcolor = color.white;

public float fogstart = 0.0f;

public float fogend = 2.0f;

public texture noisetexture;

[range(-0.5f, 0.5f)]

public float fogxspeed = 0.1f;

[range(-0.5f, 0.5f)]

public float fogyspeed = 0.1f;

[range(0.0f, 3.0f)]

public float noiseamount = 1.0f;

fogdensity用於控制霧的濃度,fogcolor用於控制霧的顏色。我們使用的霧效仿真函式是基於高度的,因此引數fogstart用於控制霧效的起始高度,fogend用於控制霧的終止高度。noisetexture是我們使用的雜訊紋理,fogxspeed和fogyspeed分別對應了雜訊紋理在x和y方向上的移動速度,以此來模擬霧的飄動效果。最後,noiseamount用於控制雜訊程度,當noiseamount為0時,表示不應用任何雜訊,即得到乙個均勻的基於高度的全域性霧效。

(5)由於本例中需要獲取攝像機的深度紋理,我們在指令碼的onenable函式中設定攝像機的相應狀態:

void onenable()
(6)最後,我們實現了onrenderimage函式:

void onrenderimage (rendertexture src, rendertexture dest)  else 

}

我們首先利用前面講到的計算近裁剪平面的4個角對應的向量,並把它們儲存在乙個矩陣型別的變數(frustumcorners)中。隨後,我們把結果和其他引數傳遞給材質,並呼叫graphics.blit (src, dest, material)把渲染結果顯示在螢幕上。

shader:

(1)我們首先宣告本例使用的各個屬性:

properties 

_fogdensity ("fog density", float) = 1.0

_fogcolor ("fog color", color) = (1, 1, 1, 1)

_fogstart ("fog start", float) = 0.0

_fogend ("fog end", float) = 1.0

_noisetex ("noise texture", 2d) = "white" {}

_fogxspeed ("fog horizontal speed", float) = 0.1

_fogyspeed ("fog vertical speed", float) = 0.1

_noiseamount ("noise amount", float) = 1

}

(2)在本節中,我們使用cginclude來組織**。我們在subshader塊中利用cginclude和endcg語義來定義一系列**:

subshader
(3)宣告**中需要使用的各個變數:

float4x4 _frustumcornersray;

sampler2d _maintex;

half4 _maintex_texelsize;

sampler2d _cameradepthtexture;

half _fogdensity;

fixed4 _fogcolor;

float _fogstart;

float _fogend;

sampler2d _noisetex;

half _fogxspeed;

half _fogyspeed;

half _noiseamount;

_frustumcornersray雖然沒有在properties中宣告,但仍可以由指令碼傳遞給shader。除了properties中宣告的各個屬性,我們還宣告了深度紋理_cameradepthtexture,unity會在背後把得到的深度紋理傳遞給該值。

(4)定義頂點著色器,和之前一樣

(5)定義片元著色器

fixed4 frag(v2f i) : sv_target
我們首先根據深度紋理來重建該畫素在世界空間中的位置。然後,我們利用內建的_time.y變數和_fogxspeed、 _fogyspeed屬性計算出當前雜訊紋理的偏移量,並據此對雜訊紋理進行取樣,得到雜訊值。我們把該值減去0.5,再乘以控制雜訊程度的屬性_noiseamount,得到最終的雜訊值。隨後,我們把該雜訊值新增到霧效濃度的計算中,得到應用雜訊後的霧效混合係數fogdensity。最後,我們使用該係數將霧的顏色和原始顏色進行混合後返回。

(6)隨後,我們定義了霧效渲染所需的pass:

pass
(7)最後,我們關閉了shader的fallback

fallback off
本節使用的雜訊紋理如下圖所示:

第十四章約束

約束 constraint 是一種保證資料完整性的規則。約束設定在單個字段或者多個字段組合上,寫入這些欄位的行資料必須要符合約束的規則 約束的五種型別 not null 非空約束,指定某列的所有行資料不能包含空值 unique 唯一性約束,指定列或者列的組合的所有行資料必須唯一 primary ke...

第十四章 約束

第十四章 約束 練習1 1.學校有乙個選課系統,其中包括如下關係模式 系 系編號 主鍵,系名稱 唯一鍵,系主任 非空約束,系所在校去 取值範圍只能在南湖校區和渾南校區 create table xi xi no varchar2 10 primary key,xi name varchar2 10 ...

第十四章 集合

1.集合 把個數不定的物件一起帶著走 集合是乙個存放任意數量的引用的物件的容器 多個物件放在另乙個物件中,此物件可成為乙個集合物件 注意 如果集合物件建立時不指定泛型,則在當前集合中可以存放任意型別的物件 包括 collection list set map list 介面的實現類有arraylis...