Unity3D之Shader自定義編輯器功能拓展

2021-07-22 17:15:09 字數 1437 閱讀 2219

一、前言

最近在開發乙個關卡類的遊戲,在匯入一些3d物體的時候,發現很多時候同乙個3d物體需要渲染的方式不一樣,比如這顆樹要雙面渲染(cull off),但在很多情況下是可以剔除背面(cull back)的,之前在寫shader方面找不到什麼好方法直接控制,乾脆就寫了兩個shader,這就造成了無謂的浪費跟資源管理的麻煩了,我們是可以更加方便地控制shader的某些屬性的。

二、正文

先看看我們最終的效果圖:

這裡我只是列了一部分的屬性作為例子進行介紹,大家當然是可以拓展到想要控制的另外屬性上面的。貼上我們需要的shader**:

好了,讓我們來分析一下具體**的作用。

1、下拉框:

這一句簡單來說就是定義了乙個float型別名字為_cullmode的變數。

[space(10)] : 這個是指在面板上留10單位的空間展示此屬性。

[enum(cullmode)] : 這裡就表明了這個變數是屬於cullmode的列舉變數,在最後的預設值為0,就是cullmode.off這個值。我們就可以根據這個列舉來進行渲染剔除型別的控制。而對應的**是:

特別要注意的是,有時候我們雖然定義了,發現所可以選擇的列舉值並不是我們想要的,那就很可能是有同名的系統列舉型別了,所以我們很多時候都盡量定義全列舉變數的引用,像這樣子做:

2、自定義的列舉下拉框

那我們是否可以使用自定義的列舉型別呢?以下就是例子

這樣我們就定義了包含了的列舉型別了,然後我們還有在cg語言裡面定義相關聯的關鍵字,它的形式是「變數名」+「_」+「列舉變數名」:

當我們要使用這幾個關鍵字的時候,就是這樣的:

這裡的**都是為了簡單舉例進行展示使用方式而已。同時,我們可以用指令碼去控制巨集,這個跟之前的系統定義的列舉變數控制是不一樣的:

因為在定義這些自定義的列舉的時候,已經生成了shader內部的乙個對應的關鍵字了,所以我們必須要用enablekeyword/disablekeyword的方式去啟用或者關閉。

3、選擇框

當我們需要定義乙個布林型的屬性的時候,我們也是可以用float去替代的:

所使用的方式是:

而平時的常規寫法是這樣的:

但我們定義了這個[toggle]之後,就可以得到乙個「變數名」+「_on」的關鍵字可以使用了。同樣地,我們用指令碼控制的時候也是一樣的方式:

4、滑動條

而當我們需要去控制乙個值在乙個範圍內的時候,我們可以使用滑動條的定義:

其實如果你不用前面的定義也是可以的,只要用range這個定義就可以了,而指令碼控制的方式也是跟setfloat的方法是一樣的。

5、隱藏顯示變數

有時候定義太多東西到面板上反而會造成策劃或者別的人看的時候迷糊,所以有些定義的變數,我們不想它顯示在面板的時候,可以這樣子做:

後續:如果大家對這些功能還不滿足的話,還可以自己寫編輯器,只要繼承「shadergui」這個類就好了,具體大家可以在這裡檢視:如果有需要,我也可以繼續寫這個類詳細的擴充套件。

unity 3D模型流光Shader

今天分享下unity中3d模型的一些shader。先來個最簡單的,就是上下滾動的純色流光。通過調整 centerrange來實現上下滾動。o.objz v.vertex.x 這裡使用模型的模型座標系模型被旋轉過所以這裡用的是x軸,同學如果想用得改下哈。flag saturate flag flag被...

Unity3D中的shader高階

unity3d shader 基礎知識 unity3d shader 官方教程翻譯 1.unity中配備了強大的陰影和材料的語言工具稱為shaderlab,以程式語言來看,它類似於cgfx和direct3d的效果框架語法,它描述了材質所必須要的一切諮詢,而不僅僅侷限於平面頂點 畫素著色。2.在uni...

Unity3D內建Shader翻譯一

unity3d內建了很多shader,文件很詳細,自己翻一下.便於加深印象.首先先解釋下unity3d的shader.unity裡面的shaders是使用一種叫shaderlab的語言編寫的,它同微軟 的.fx檔案或者nvidia的cgfx有些類似。傳統意義上的vertex shader和pixel...