unity shader 编辑器扩展类 ShaderGUI
这应该unity5才出的新功能了,今天看文档时刚巧看到了,就来尝试了一下。
效果如图:
shader 的编辑器扩展分为2种方法:
- 是通过
UnityEditor
下的ShaderGUI
类来实现的,形式比较近似于我们一般对unity编辑器的扩展方式。 - 是通过直接在
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") != -; 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 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) =
[Toggle] _MyToggle1("MyToggle1", Float) =
[Toggle(MyToggle2)] _MyToggle2("MyToggle2", Float) =
[KeywordEnum(One, Two, Three)] _MyEnum("MyEnum", Float) =
}
SubShader
{
Tags{ "RenderType" = "Opaque" }
LOD 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的更多相关文章
- Thinkphp编辑器扩展类kindeditor用法
一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...
- Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口
Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...
- Unity 3D编辑器扩展介绍、教程(一) —— 创建菜单项
Unity编辑器扩展教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introduct ...
- Unity编辑器扩展chapter1
Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...
- Unity 编辑器扩展 场景视图内控制对象
http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...
- Unity Shader IDE — Sublime Text2
使用MonoDevelop写了一段时间的Shader代码,发现效率太低了,所以换用Sublime Text. 安装Sublime Text 1.下载 sublime Text2 官网:http://w ...
- Unity编辑器扩展
在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...
- Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类
前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...
- Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据
Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据 unity unity Editor ScirptableObject Unity编辑器扩展 Chapt ...
随机推荐
- Request.Url.Port 获取不到正确的端口号
今天遇到一个很奇怪的事情,用request.url.port来获取一个请求的端口,返回是80 ,很纳闷啊我的请求上面是http://www.XX.com:8088 啊,怎么会是80啊,太不可思议了! ...
- 墨卡托投影、高斯-克吕格投影、UTM投影及我国分带方法
转自原文 墨卡托投影.高斯-克吕格投影.UTM投影及我国分带方法 一.墨卡托投影.高斯-克吕格投影.UTM投影 1. 墨卡托(Mercator)投影 墨卡托(Mercator)投影,是一种" ...
- 获取textview行数
获取textview行数 textview 代码 import android.content.Context; import android.graphics.Canvas; import andr ...
- 关于国内外CV领域牛人的博客链接 .
此文为转载文章,尊重知识产权http://blog.csdn.net/carson2005/article/details/6601109此为原文链接,感谢作者! 以下链接是关于计算机视觉(Compu ...
- tez参数
https://tez.apache.org/releases/0.8.4/tez-api-javadocs/configs/TezConfiguration.html
- CentOS7关闭SELinux
查看 [root@dev-server ~]# getenforce Disabled [root@dev-server ~]# /usr/sbin/sestatus -v SELinux statu ...
- StringBuilder.append()与String的"+"的效率PK
如果String通过"+"来拼接,如果拼接的字符串是常量,则效率会非常高,因为会进行编译时优化,这个时候StringBuilder的append()是达不到的. 如果将String ...
- [Algorithm] Maximum Contiguous Subarray algorithm implementation using TypeScript / JavaScript
Naive solution for this problem would be caluclate all the possible combinations: const numbers = [1 ...
- AngularJS, Ember.js, Backbone这类新框架与 jQuery的重要区别在哪里?
jQuery主要是用来操作DOM的,如果单单说jQuery的话就是这样一个功能,它的插件也比较多,大家也都各自专注一个功能,可以说jQuery体系是跟着前端页面从静态到动态崛起的一个产物,他的作用就是 ...
- C# Redis Server分布式缓存编程(一)
这篇文章我将介绍如果用最简洁的方式配置Redis Server, 以及如何使用C#和它交互编程 一. 背景介绍 Redis是最快的key-value分布式缓存之一 缺点: 没有本地数据缓冲, 目前还没 ...