unity shader 編輯器擴充類 ShaderGUI

來源:互聯網
上載者:User

標籤:uila   float   功能   enable   shadow   tom   begin   sub   ble   

這應該unity5才出的新功能了,今天看文檔時剛巧看到了,就來嘗試了一下。

效果

shader 的編輯器擴充分為2種方法:

  1. 是通過UnityEditor下的ShaderGUI類來實現的,形式比較近似於我們一般對unity編輯器的擴充方式。
  2. 是通過直接在shader代碼上通過unity為我們預定義好的一些命令來擴充。

個人比較推薦使用第一種方法,第二種在嘗試時發現

①是第二種控制項的種類有限。限制還特別多,變數申請的不對的話,有時也不報錯,不利於維護。

②是文檔裡還有錯誤+沒說清楚的地方。

③是第一種方法建立的.cs檔案是可以複用到,我們可以唯寫一個.cs檔案,然後跟好幾個shader檔案進行關聯。

先來說說第一種方法:

官方文檔:http://docs.unity3d.com/Manual/SL-CustomShaderGUI.html

CS代碼如下:

 1 using UnityEngine; 2 using UnityEditor; 3 using System; 4  5 public class TestShaderGUI : ShaderGUI 6 { 7     public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) 8     { 9         // render the default gui10         base.OnGUI(materialEditor, properties);11 12         Material targetMat = materialEditor.target as Material;13 14         // see if redify is set, and show a checkbox15         bool CS_BOOL = Array.IndexOf(targetMat.shaderKeywords, "CS_BOOL") != -1;16 17         EditorGUI.BeginChangeCheck();18         CS_BOOL = EditorGUILayout.Toggle("CS_BOOL", CS_BOOL);19 20         if (EditorGUI.EndChangeCheck())21         {22             // enable or disable the keyword based on checkbox23             if (CS_BOOL)24                 targetMat.EnableKeyword("CS_BOOL");25             else26                 targetMat.DisableKeyword("CS_BOOL");27         }28     }29 }

Shader代碼:

 1 Shader "MyTest/TestShaderGUI" 2 { 3     Properties 4     { 5         _MainTex("Texture", 2D) = "white" {} 6     } 7     SubShader 8     { 9         Tags{ "RenderType" = "Opaque" }10         LOD 20011 12         CGPROGRAM13 14         #pragma surface surf Lambert addshadow15 16         #pragma shader_feature CS_BOOL17 18         sampler2D _MainTex;19 20         struct Input21         {22             float2 uv_MainTex;23         };24 25         void surf(Input IN, inout SurfaceOutput o)26         {27             half4 c = tex2D(_MainTex, IN.uv_MainTex);28             o.Albedo = c.rgb;29             o.Alpha = c.a;30 31             #if CS_BOOL32             o.Albedo.gb *= 0.5;33             #endif34         }35 36         ENDCG37     }38     CustomEditor "TestShaderGUI"39 }

重點就是 
#pragma shader_feature CS_BOOL 
CustomEditor "TestShaderGUI"

shader_feature 是unity用來在shader中建立編譯指令變數的關鍵字,它的作用與multi_compile幾乎是一樣的。 
我們通過建立的變數與TestShaderGUI類中建立的控制項來相關聯,達到傳值的目的。 
CustomEditor的作用則是將shader檔案與cs檔案關聯起來。

#pragma shader_feature#pragma multi_compile的問題可以看這裡來進行瞭解,官方文檔: 
http://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html

這裡說一下我的理解: 
首先#pragma shader_feature#pragma multi_compile的作用其實都是為了給unity所謂的"mega shaders""uber shaders"建立變數的。 
唯一的區別就是沒有被使用過的shader_feature變數將不會被編譯。 
所以在使用上區別就是在materials的作用範圍內用shader_feature,而multi_compile的範圍一般則是全域的。 
例如有一種全域變數是multi_compile_fog,則是跟開啟霧效相關的。

第二種方法:

官方文檔:http://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html

Shader代碼:

Shader "MyTest/TestShaderGUI"{    Properties    {        _MainTex("Texture", 2D) = "white" {}        // 聲明需要的控制項        [Toggle(S_BOOL)] _S_BOOL("S_BOOL", Int) = 0        [Toggle] _MyToggle1("MyToggle1", Float) = 0        [Toggle(MyToggle2)] _MyToggle2("MyToggle2", Float) = 0        [KeywordEnum(One, Two, Three)] _MyEnum("MyEnum", Float) = 0    }    SubShader    {        Tags{ "RenderType" = "Opaque" }        LOD 200        CGPROGRAM        #pragma surface surf Lambert addshadow        // 建立變數,用來接收控制項的值        #pragma shader_feature S_BOOL        #pragma shader_feature _MYTOGGLE1_ON        #pragma shader_feature MyToggle2        #pragma multi_compile _MYENUM_ONE _MYENUM_TWO _MYENUM_THREE        sampler2D _MainTex;        struct Input        {            float2 uv_MainTex;        };        void surf(Input IN, inout SurfaceOutput o)        {            half4 c = tex2D(_MainTex, IN.uv_MainTex);            o.Albedo = c.rgb;            o.Alpha = c.a;            #if S_BOOL            o.Albedo.gb *= 0.5;            #endif            //#if _MYTOGGLE1_ON            //o.Albedo.gb *= 0.5;            //#endif            //#if MyToggle2            //o.Albedo.gb *= 0.5;            //#endif            //#if _MYENUM_ONE            //o.Albedo.gb *= 0.2;            //#elif _MYENUM_TWO            //o.Albedo.gb *= 0.5;            //#elif _MYENUM_THREE            //o.Albedo.gb *= 0.7;            //#endif        }        ENDCG    }}

 原連結:http://lib.csdn.net/article/unity3d/41995

unity shader 編輯器擴充類 ShaderGUI

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.