Unity-自定義渲染紋理
自定義渲染紋理是渲染紋理的擴(kuò)展,允許用戶使用著色器輕松更新相關(guān)紋理。這對于實(shí)現(xiàn)各種類型的復(fù)雜模擬(例如焦散、雨水效果的波紋模擬、墻上的液體噴濺等)非常有用。此外,它還提供腳本和著色器框架,從而協(xié)助進(jìn)行更復(fù)雜的配置,如部分或多通道更新、改變更新頻率等。
要使用自定義渲染紋理,必須創(chuàng)建新的自定義渲染紋理資源并為其分配材質(zhì)。然后,此材質(zhì)將根據(jù)各種參數(shù)更新紋理的內(nèi)容。再然后,就像常規(guī)紋理一樣,可將自定義渲染紋理分配給任何類型的材質(zhì),甚至可用于另一個自定義渲染紋理。
屬性

自定義渲染紋理的檢視面板將顯示渲染紋理檢視面板的大多數(shù)屬性以及許多特定屬性。
渲染紋理:
屬性:????????????????????????????????????????????????????????????????????????????????????????????????功能:
Dimension????????渲染紋理的尺寸?????
????????2D????????????渲染紋理將是二維的。?????
????????Cube????????渲染紋理將是立方體貼圖?????
????????3D????????????渲染紋理將是三維的Size渲染紋理的大?。ㄒ韵袼貫閱挝唬?。
Color Format渲染紋理的格式sRGB (Color Render Texture)此渲染紋理是否使用 sRGB 讀/寫轉(zhuǎn)換(只讀)。
Enable Mip Maps此渲染紋理是否使用 MipMap?
Auto generate Mip Maps啟用此屬性可自動生成 MipMap。
Wrap Mode選擇紋理平鋪時(shí)的行為方式?????
Repeat紋理重復(fù)(平鋪)自身?????
Clamp紋理的邊緣被拉伸Filter Mode選擇紋理在通過 3D 變換拉伸時(shí)如何進(jìn)行過濾:????
Point紋理在靠近時(shí)變?yōu)閴K狀?????
Bilinear紋理在靠近時(shí)變得模糊?????
Trilinear與 Bilinear 類似,但紋理也在不同的 Mip 級別之間模糊
Aniso Level以大角度查看紋理時(shí)提高紋理質(zhì)量。適用于地板和地面紋理
自定義紋理:
自定義紋理參數(shù)分為三個主要類別:
Material:定義用于更新紋理的著色器。
Initialization:控制在著色器執(zhí)行更新之前如何初始化紋理
Update:控制著色器如何更新紋理。
屬性:????????????????????????????????????????????????????????????????????????????????????????????功能:
Material用于更新自定義渲染紋理的材質(zhì)?????
????Shader Pass用于更新自定義紋理的著色通道。該組合框?qū)@示材質(zhì)中可用的所有通道。Initialization Mode應(yīng)初始化紋理的頻率。?????
????OnLoad紋理在創(chuàng)建時(shí)初始化一次。?????
????Realtime在每一幀初始化紋理。?????
????OnDemand通過腳本按需初始化紋理。
Source應(yīng)如何初始化紋理。?????
Texture and Color由紋理疊加顏色來初始化紋理。?????????
Initialization Color用于初始化自定義紋理的顏色。如果還提供了初始化紋理,則將通過疊加顏色和紋理來初始化自定義紋理。?????????
Initialization Texture用于初始化自定義紋理的紋理。如果還提供了初始化顏色,則將通過疊加顏色和紋理來初始化自定義紋理。?????
Material紋理將由材質(zhì)初始化。?????????
Initialization Material用于初始化自定義紋理的材質(zhì)。
Update Mode著色器應(yīng)更新紋理的頻率。?????
OnLoad紋理在創(chuàng)建時(shí)更新一次。?????
Realtime在每一幀更新紋理。?????
OnDemand通過腳本按需更新紋理。
Period(僅限 Realtime 選項(xiàng))更新實(shí)時(shí)紋理的間隔秒數(shù)(0.0 表示更新每一幀)。
Double Buffered紋理將接受雙緩沖。每次更新都將交換兩個緩沖區(qū),因此可讓用戶在著色器中讀取前一次更新的結(jié)果。
Wrap Update Zones啟用此屬性允許部分更新區(qū)域包圍紋理的邊框。
Cubemap Faces(僅限立方體貼圖)通過一系列開關(guān)允許用戶對每個立方體貼圖面啟用/禁用更新。
Update Zone Space在此坐標(biāo)系統(tǒng)中定義更新區(qū)域。???? Normalized所有坐標(biāo)和大小都在 0 到 1 之間,左上角從 (0, 0) 開始???? Pixel所有坐標(biāo)和大小都以像素寬度和高度所限制的像素表示。左上角從 (0, 0) 開始Update Zone List紋理的更新區(qū)域列表(有關(guān)更多詳細(xì)信息,請參閱下文)
將自定義渲染紋理導(dǎo)出到文件:
可通過上下文“Export”菜單將自定義渲染紋理導(dǎo)出到 PNG 或 EXR 文件(具體取決于紋理格式)。
更新區(qū)域 (Update Zones):
默認(rèn)情況下,更新自定義渲染紋理時(shí),材質(zhì)會立即更新整個紋理。自定義紋理的一個重要功能是用戶能夠定義部分更新區(qū)域。有了此功能,用戶可根據(jù)需要定義多個區(qū)域以及處理它們的順序。
此功能可用于幾種不同的目的。例如,您可以使用多個小區(qū)域在紋理上繪制水滴,然后執(zhí)行完整通道以模擬波紋。此外,如果不需要更新完整紋理,也可以使用此功能作為優(yōu)化手段。

更新區(qū)域具有各自的屬性集。Update Zone Space?將反映在顯示中。根據(jù)紋理的?Dimension?屬性,坐標(biāo)將為 2D(對于 2D 和立方體紋理)或 3D(對于 3D 紋理)。
屬性:????????????????????????????????????????????????????????????????????????????????????????????????????????????功能:
Center???????????????????????????????????更新區(qū)域中心的坐標(biāo)。
Size???????????????????????????????????????更新區(qū)域的大小。
Rotation????????????????????????????????更新區(qū)域的方向(以度為單位,3D 紋理中不可用)。
Shader Pass?????????????????????????用于此更新區(qū)域的著色器通道。如果保留為默認(rèn)值,則此更新區(qū)域?qū)⑹褂脵z視面板主要部分中定義的著色器通道,否則將使用提供的著色器通道。
Swap (Double Buffer)????????(僅適用于雙緩沖紋理)如果為 true,則在處理此更新區(qū)域之前將交換緩沖區(qū)。
雙緩沖自定義紋理
自定義渲染紋理可以是“雙緩沖的”(Double Buffered)。在內(nèi)部有兩種紋理,但從用戶的角度來看,它們是相同的。每次更新后將交換兩個紋理。這種機(jī)制可讓用戶在自定義渲染紋理中寫入新結(jié)果時(shí)讀取上次更新的結(jié)果。如果著色器需要使用已在紋理中寫入的內(nèi)容但不能將值與經(jīng)典混合模式混合,則此功能尤其有用。如果著色器必須對前一結(jié)果的不同像素進(jìn)行采樣,也需要用到此功能。
性能警告:由于某些技術(shù)問題,雙緩沖當(dāng)前涉及每次交換時(shí)進(jìn)行紋理的復(fù)制,這可能導(dǎo)致性能下降,具體取決于其執(zhí)行頻率和紋理分辨率。
鏈接自定義渲染紋理
自定義渲染紋理需要材質(zhì)才能進(jìn)行更新。此材質(zhì)可將紋理作為輸入。這意味著自定義紋理可用作生成另一個紋理的輸入。這樣一來,用戶就可以鏈接多個自定義紋理以生成更復(fù)雜的多步模擬。系統(tǒng)將正確處理所有依賴關(guān)系,確保以正確的順序進(jìn)行不同的更新。
為自定義渲染紋理編寫著色器
更新自定義紋理就像在渲染紋理中執(zhí)行 2D 后期處理一樣。為了幫助用戶編寫自定義紋理著色器,我們提供了一個帶有實(shí)用函數(shù)和內(nèi)置輔助變量的小框架。
下面是一個非常簡單的示例,它將使用顏色疊加顏色的方式填充紋理:
為自定義紋理編寫著色器時(shí),唯一必需的步驟是:
* #include “UnityCustomRenderTexture.cginc”
使用提供的頂點(diǎn)著色器?CustomRenderTextureVertexShader
為像素著色器使用提供的輸入結(jié)構(gòu)?v2f_customrendertexture
除此之外,用戶可以根據(jù)自己的喜好自由編寫像素著色器。
以下是在初始化材質(zhì)中使用的著色器的另一個示例:
與更新著色器的情況下相同,唯一必需的步驟如下:
* #include “UnityCustomRenderTexture.cginc”
使用提供的頂點(diǎn)著色器 InitCustomRenderTextureVertexShader
為像素著色器使用提供的輸入結(jié)構(gòu)?v2f_init_customrendertexture
為了幫助用戶完成此過程,我們提供了一組內(nèi)置值:
來自?v2f_customrendertexture?結(jié)構(gòu)的輸入值:
名稱Type值localTexcoord
float3
相對于當(dāng)前正在處理的更新區(qū)域的紋理坐標(biāo)。globalTexcoord
float3
相對于自定義渲染紋理本身的紋理坐標(biāo)primitiveID
uint
當(dāng)前正在處理的更新區(qū)域的索引。direction
float3
對于立方體自定義渲染紋理,立方體貼圖內(nèi)當(dāng)前像素的方向。
來自?v2f_init_customrendertexture?結(jié)構(gòu)的輸入值:
名稱Type值texcoord
float3相對于自定義渲染紋理本身的紋理坐標(biāo)。
全局值:
名稱Type值_CustomRenderTextureWidth
float
自定義紋理的寬度(以像素為單位)_CustomRenderTextureHeight
float
自定義紋理的高度(以像素為單位)_CustomRenderTextureDepth
float
自定義紋理的深度(以像素為單位,僅適用于 3D 紋理,否則將始終等于 1)。_CustomRenderTextureCubeFace
float
僅適用于立方體貼圖:正在處理的當(dāng)前立方體貼圖面的索引 (-X, +X, -Y, +Y, -Z, +Z)。_CustomRenderTexture3DSlice
float
僅適用于 3D 紋理:正在處理的當(dāng)前 3D 切片的索引。_SelfTexture2D
Sampler2D
僅適用于雙緩沖紋理:該紋理包含上次交換之前的上次更新的結(jié)果。_SelfTextureCube
SamplerCUBE
僅適用于雙緩沖紋理:該紋理包含上次交換之前的上次更新的結(jié)果。_SelfTexture3D
Sampler3D
僅適用于雙緩沖紋理:該紋理包含上次交換之前的上次更新的結(jié)果。
通過腳本控制自定義渲染紋理
此處描述的大多數(shù)功能均可通過腳本 API 訪問到。更改材質(zhì)參數(shù)、更新頻率、更新區(qū)域、請求更新等全都可以使用腳本完成。
但要記住的一件事是,請求對自定義紋理進(jìn)行的任何更新都將在幀的開頭非常特定的時(shí)間發(fā)生,并提供自定義紋理的最新狀態(tài)。這種機(jī)制可保證使用此紋理的任何材質(zhì)都具有最新結(jié)果。
這意味著以下模式:
不會產(chǎn)生使用第一個更新區(qū)域數(shù)組完成一次更新再使用另一個數(shù)組完成第二次更新的“預(yù)期”結(jié)果。此模式將對第二個數(shù)組進(jìn)行兩次更新。
根據(jù)經(jīng)驗(yàn)法則,任何修改后的屬性都只能在下一幀中激活。