unity shader 编辑器扩展类 ShaderGUI

原创 2016年04月22日 00:38:49

这应该unity5才出的新功能了,今天看文档时刚巧看到了,就来尝试了一下。

效果如图:

这里写图片描述


shader 的编辑器扩展分为2种方法:

  1. 是通过UnityEditor下的ShaderGUI类来实现的,形式比较近似于我们一般对unity编辑器的扩展方式。
  2. 是通过直接在shader代码上通过unity为我们预定义好的一些命令来扩展。

个人比较推荐使用第一种方法,第二种在尝试时发现

①是第二种控件的种类有限。限制还特别多,变量申请的不对的话,有时也不报错,不利于维护。

②是文档里还有错误+没说清楚的地方。

③是第一种方法创建的.cs文件是可以复用到,我们可以只写一个.cs文件,然后跟好几个shader文件进行关联。


先来说说第一种方法:

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

CS代码:

using UnityEngine;
using UnityEditor;
using System;

public class TestShaderGUI : ShaderGUI
{
    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        // render the default gui
        base.OnGUI(materialEditor, properties);

        Material targetMat = materialEditor.target as Material;

        // see if redify is set, and show a checkbox
        bool CS_BOOL = Array.IndexOf(targetMat.shaderKeywords, "CS_BOOL") != -1;

        EditorGUI.BeginChangeCheck();
        CS_BOOL = EditorGUILayout.Toggle("CS_BOOL", CS_BOOL);

        if (EditorGUI.EndChangeCheck())
        {
            // enable or disable the keyword based on checkbox
            if (CS_BOOL)
                targetMat.EnableKeyword("CS_BOOL");
            else
                targetMat.DisableKeyword("CS_BOOL");
        }
    }
}

Shader代码:

Shader "MyTest/TestShaderGUI"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags{ "RenderType" = "Opaque" }
        LOD 200

        CGPROGRAM

        #pragma surface surf Lambert addshadow

        #pragma shader_feature CS_BOOL

        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 CS_BOOL
            o.Albedo.gb *= 0.5;
            #endif
        }

        ENDCG
    }
    CustomEditor "TestShaderGUI"
}

重点就是
#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
    }
}

这个就不细说了,上面的注释已经把重点标出来了,严重不推荐用这种做法,2333。


以上希望对你有用,我也就没白码这么多字,觉得有用的话,记得给哥点个赞!

版权声明:本文为博主原创文章,未经博主允许不得转载。

【Unity3D Shader编程】之九 深入理解Unity5中的Standard Shader (一)&屏幕水幕特效的实现

概要:本文主要介绍了Unity5中的标准着色器,并且也涉及到了基于物理的着色、延迟渲染等高级着色技术,而在文章后半部分,也对屏幕水幕特效的实现方法进行了讲解与分析。   依然是附上一组本文配套工程的运...
  • zhmxy555
  • zhmxy555
  • 2015年11月01日 19:21
  • 37806

unity shader 编辑器扩展类 ShaderGUI

这应该unity5才出的新功能了,今天看文档时刚巧看到了,就来尝试了一下。 效果如图: shader 的编辑器扩展分为2种方法: 是通过UnityEditor下的ShaderGUI类来实现...
  • e295166319
  • e295166319
  • 2016年09月02日 14:23
  • 557

UnityShaderVariant的一些探究心得

最近遇到了一个问题,角色在Unity编辑器里运行渲染结果都是好的,打包到IOS上却发现,角色身上渲染的很黑.花了些时间查了查,又试了试,把这方面算是初步弄清楚了。   先说出现问题的原因,由于我们把...
  • long0801
  • long0801
  • 2017年08月19日 16:13
  • 242

Unity Shader学习(一)

一 Unity Shader分为: (1)Standard Surface Shader:会产生一个包含标准光照模型的表面着色器 (2)Unlit Shader :会产生一个不包含光照但包含雾效的...
  • sinat_34382237
  • sinat_34382237
  • 2018年01月08日 12:17
  • 48

UnityShaderVariant的一些探究心得

最近遇到了一个问题,角色在Unity编辑器里运行渲染结果都是好的,打包到IOS上却发现,角色身上渲染的很黑.花了些时间查了查,又试了试,把这方面算是初步弄清楚了。   先说出现问题的原因,由于我们把...
  • a54654132
  • a54654132
  • 2017年08月20日 19:37
  • 109

两个牛叉哄哄的Unity3d Shader编辑器

【AssetStore经验分享】今天遭吓到了。。   楼主# 更多发布于:2013-02-27 22:31 自己做的插件Xffect Editor Pro ...
  • ldghd
  • ldghd
  • 2013年07月12日 18:55
  • 6281

Shader入门教程(一)

学习Unity有一段时间了,都说Unity想要进阶得学会Shader编程,因此花了一阵子来学习Shader编程。学了之后才发现,Shader并没有我原先想的那么复杂,掌握它的原理和语法后,我们也能用s...
  • tyuiof
  • tyuiof
  • 2016年10月08日 10:11
  • 6252

unity3D Text 使用shader

unity里面的3dtext可以很方便得使用,包括了替换材质等等 替换字体简单的就是下面视图步骤,注意使用的Texture是导入字体后的Texture shader使用以下基本写法...
  • shenmifangke
  • shenmifangke
  • 2015年12月01日 12:38
  • 3403

Shader山下(二十一)多重变体(Multiple Variants)

Shader山下(二十)编译指令(Compilation Directives)介绍了如何使用编译指令,本文就专文介绍一下多重编译(multi_compile)指令。 我们可以使用multi_com...
  • ecidevilin
  • ecidevilin
  • 2016年10月21日 23:34
  • 2186

Unity5 (5.0-5.2) Shader编译机制初探 - 小心,Shader在吞噬你的内存

又被Unity坑了一把,简单说下吧,下面都是流水账,结论就写在最后了,就是Unity5 - 5.2的shader编译机制真是不咋地。1.Why Always me?问题是这样的,我照着Unity5 的...
  • Sparrowfc
  • Sparrowfc
  • 2016年03月16日 15:35
  • 6541
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:unity shader 编辑器扩展类 ShaderGUI
举报原因:
原因补充:

(最多只允许输入30个字)