在Unity Shader中自定義材質面板

2021-03-02 Unity3D遊戲開發精華教程乾貨

很多時候,我們為了使寫出來的shader更加直觀易用,需要對材質面板的顯示樣式做一些簡單的修改。雖然Unity提供了Custom Shader GUI的方法,但是對於我們只想單純地寫一個shader來說,還要再去改GUI未免太過麻煩。所以我們還是決定直接在shader代碼裡對材質面板進行設定。



Shader "Custom/Custom Material Inspector"{  Properties  {        [Header(Custom Material Inspector)]
[Space]
_MainTex ("Main Tex", 2D) = "white" {}
[NoScaleOffset]_SecondTex ("Second Tex", 2D) = "white" {}
[Space(50)]
[Toggle] _Invert ("Invert color?", Float) = 0
[Toggle(ENABLE_FANCY)] _Fancy ("Fancy?", Float) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("Src Blend Mode", Float) = 1 [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("Dst Blend Mode", Float) = 1 [Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull Mode", Float) = 1 [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 0
[Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Float) = 0 [KeywordEnum(None, Add, Multiply)] _Overlay ("Overlay mode", Float) = 0
[PowerSlider(3.0)] _Brightness ("Brightness", Range (0.01, 1)) = 0.1 } SubShader { Tags { "Queue"="Transparent" "RenderType"="Transparent" } Blend [_SrcBlend] [_DstBlend] Cull [_Cull] ZTest [_ZTest] ZWrite [_ZWrite]
Pass { CGPROGRAM
#pragma shader_feature _INVERT_ON
#pragma shader_feature ENABLE_FANCY
#pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY
#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"
sampler2D _MainTex; float4 _MainTex_ST; sampler2D _SecondTex; float4 _SecondTex_ST; float _Brightness;
struct v2f { float4 uv : TEXCOORD0; float4 vertex : SV_POSITION; };
v2f vert (appdata_base v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex); o.uv.zw = TRANSFORM_TEX(v.texcoord, _SecondTex); return o; }
fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv.xy);
#if _INVERT_ON col = 1 - col; #endif
#if ENABLE_FANCY col.r = 0.5; #endif
fixed4 secCol = tex2D(_SecondTex, i.uv.zw);
#if _OVERLAY_ADD col += secCol; #elif _OVERLAY_MULTIPLY col *= secCol; #endif
col *= _Brightness;
return col; } ENDCG } }}

注意:以上shader僅僅只是為了方面演示,從而把所有情況進行了匯總。從渲染效果的角度來說並不是一個正常的shader。





如果有興趣,也可以詳細閱讀Unity的官方文檔:

https://docs.unity3d.com/2019.3/Documentation/ScriptReference/MaterialPropertyDrawer.html


聲明:發布此文是出於傳遞更多知識以供交流學習之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與我們聯繫,我們將及時更正、刪除,謝謝。

作者:Faith Tong

原文:https://zhuanlan.zhihu.com/p/78589597

More:【微信公眾號】 u3dnotes

相關焦點

  • Unity 3d可視化節點材質Shader Forge實用教程 初級篇
    大家好,我們前段時發布了免費的shader forge教程,現在更完整,更強大的Shader Forge實用教程來了!
  • Unity Shader 基礎教程
    然後在剛才創建的shader上點擊右鍵Create>Material 創建一個材質球,Unity將自動創建一個材質球並使用剛才創建的著色器的名字。最後,通過單擊或者拖動的方式將材質賦予我們在場景中創建的所有對象上。
  • Unity3D 實用技巧 - Unity Shader 匯總式學習·初探篇
    在Unity shader裡面,我們可以做的事情遠多於一個傳統意義上的Shader。在傳統的shader中,我們僅可以編寫特定類型的Shader,例如頂點著色器,片元著色器等。在Unity Shader中,我們可以在同一個文件裡面同時包含需要的頂點著色器和片元著色器代碼。在傳統shader中,我們無法設置一些渲染設置,例如是否開啟混合,深度測試等,這些是開發者在另外的代碼中自行設置的。
  • 一種Shader變體收集和打包編譯優化的思路
    _USE_FUNCTION_B // 自定義多編譯選項  有了這些編譯開關標記,我們就可以寫很少的Shader代碼,從而依附在這份骨架代碼上,來實現含有細微差異功能的變種Shader代碼。  Unity在Project Settings面板最下面隱藏了這個最為重要的功能:
  • 隨風擺動的草叢 — Unity Shader Graph 2D 初探
    微信有壓縮,請在「閱讀原文」中打開圖片查看細節基本思路實現細節1. Split 節點與 Combine 節點的使用Time 節點是任何隨時間變化的效果中必不可少的。UV 的取值範圍為(0, 1)隨著 InfluenceHeight 的增大,輸出結果越來越極化,結合 Lerp 節點的定義可以固定擾動的作用範圍,實現高草地下半部分不受影響的效果,更接近於現實中草地的表現。
  • 零基礎入門Unity Shader(九)
    那麼除了在SubShader中定義的Pass 不同以外,我們還能如何定義SubShader呢,我們知道在SubShader和Pass中都有Tags可選參數組,Tags的作用是告訴引擎如何去渲染我們的對象,語法格式如下:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
  • 《卡通湖水渲染思路》與《Unity Shader ScreenPos》詳解
    如此我們希望改進混合實現我們自定義的混合效果(官方的Blend和Blend OP命令功能較少)自定義alphaBlend方法:ComputeScreenPos函數首先要知道ScreenPos中存儲的是什麼,就要知道shader中ScreenPos是如何求得的,一般情況下,我們會採用ComputeScreenPos函數來計算模型頂點的ScreenPos(需要注意的是,這裡的ScreenPos並不是真正的頂點在屏幕中的坐標值,而是一個齊次空間坐標)
  • Unity Standard Shader 技術分析
    最後再線性疊加到最後顏色輸出中。Unity Standard Shader的自發光實現是非常標準的,完全符合路徑積分的描述。Unity Standard Shader的入口在 Standard.shader 文件中。
  • Unity 重Built-in到URP函數對應整理
    >總體結構首先添加 "RenderPipeline" = "UniversalPipeline" 到Tag 下一步 所有的URP shader 都是使用HLSLPROGRAM/ENDHLSL/etc.貼圖/採樣器 聲明宏Unity 有很多紋理/採樣器 用來兼容不同平臺 ,這些仍然在URP 中,但現在有了不同的名稱和新增,由於數量很多這裡不會全部列出,你可以針對不同API平臺查看他們的具體定義 API
  • Unity PBR Standard Shader 實現詳解 (三)
    上一篇《Shader框架和數據準備》中,我們寫了一個完整的shader,但這個shader的主要內容並不是PBR計算,而是計算前的數據準備
  • Unity3D Shader 新手教程—更好的卡通Shader
    在shader中學習更多不同參考坐標系(空間space)以及其作用。深入學習一個實用的fragment shader。學習矩陣相乘和Unity內建矩陣的使用。_Outline屬性值,範圍為0.0~1.0,我們在CG代碼中定義一個相同的變量float _Outline。
  • 梳理 Unity Shader 的基本結構
    例如,Shader "Path0/Path1/CustomShader" 將位於 Path0 → Path1 → CustomShader: 0x03 屬性Properties 括號中定義的屬性將在材質面板上展示,可以方便地進行調節。
  • 程序丨Unity 渲染教程(十):更多複雜的應用場景
    1.2遮擋UI因為我們有一個自定義的面板GUI,所以需要手動添加一個新的屬性到我們shader的UI中。但是,要在材質中激活關鍵字,你必須通過檢視面板更改所有相關貼圖。否則,著色器的GUI面板將無法正確設置關鍵字。在創建新的材質貼圖時,這不是一個問題,但是在更改後,現有的材質貼圖需要刷新後才能實現修改。3.2 使用關鍵字為了使用關鍵字我們需要修改包含文件。首先,GetAlbedo方法可以從細節貼圖部分移除。
  • Unity PBR Standard Shader 實現詳解(一)
    這個系列的第一篇不會進入shader,先做一個簡單的PBR內容的普及,目標受眾是美術或者想簡單了解PBR的人。1.0 PBR的概念關於PBR,我之前發過一篇八猴的翻譯文章,其實已經說的比較詳盡,完全不了解的可以先看看。那麼我再具體的總結一下:所謂PBR,就是基於真實世界光和材質的互相作用的機制,進行渲染的方式。
  • 【厚積薄發】Packages目錄下Shader打包疑問
    例如,工程目錄中有材質球引用到URP的Shader,那麼材質球打成AssetBundle之後會將Shader包含進去,會有Shader解析耗時。將所有依賴到的Shader(包括Packages中的)都使用AssetBundleBuild設置到同一個shader.bundle的,打包後也解包確認了,Packages中的Shader也打包在shader.bundle而不會被包含在材質AssetBundle中。
  • Unity Shader中的平移、縮放、旋轉
    然後在Hierachy面板中創建一個 Cube 物體,並在「Material」文件夾裡創建一個 Material(材質),命名為「CubeMat」,然後為其 Cube 物體添加材質,之後在 Material 的 Shader
  • Unity shader五種繪製等寬sin曲線
    一共嘗試了5種方法:萬能lerp大法多點檢測法導數解析法超越函數牛頓迭代法超越函數切比雪夫迭代法解法1:萬能lerp大法首先明確 直接偏移函數曲線是不等寬的 ,頂部的區域更寬些.如下圖但是可以先用shader簡單實現下,shader編程與cpu打點編程不同 他是一個個xy然後判斷是否在某範圍內
  • Unity Shader 使用滑鼠繪製自由多邊形
    我們已經了解了怎樣使用 Shader來繪製簡單的點和線,本文將延續上次的話題,講述一下如何在場景中使用Unity Shader繪製自由多邊形。本文所述的程序,支持在地圖中用滑鼠點擊,確定多邊形頂點,並且繪製多邊形的邊,在內部填充半透明的顏色。先展示一下最終效果,完整的工程在文末的附件中。
  • 3D場景編輯導出-LayaAir引擎Unity插件使用詳解
    2.3、 導入LayaAir的Unity插件Unity裡有一個導入自定義包的功能,通過這個功能,可以在Unity裡導入LayaAir引擎提供的專屬功能包,用來導出Unity裡編輯好的場景和資源,然後再用以LayaAir引擎3D的開發。在Unity裡導入這個自定義的LayaAir功能包的過程,我們可以視為安裝了一個LayaAir引擎資源導出的Unity插件。
  • Unity中使用URP的RenderFeature快樂滴RTXON!
    要想使用RenderFeature,目前直接下載最新的unity使用URP即可。故第一步則先需要先創建一個RenderFeature如下。(需要把創建的RenderFeature 拖入 forwardRender)