unity shader 编辑器扩展类 ShaderGUI

这应该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 gui
10         base.OnGUI(materialEditor, properties);
11 
12         Material targetMat = materialEditor.target as Material;
13 
14         // see if redify is set, and show a checkbox
15         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 checkbox
23             if (CS_BOOL)
24                 targetMat.EnableKeyword("CS_BOOL");
25             else
26                 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 200
11 
12         CGPROGRAM
13 
14         #pragma surface surf Lambert addshadow
15 
16         #pragma shader_feature CS_BOOL
17 
18         sampler2D _MainTex;
19 
20         struct Input
21         {
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_BOOL
32             o.Albedo.gb *= 0.5;
33             #endif
34         }
35 
36         ENDCG
37     }
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 200CGPROGRAM#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_THREEsampler2D _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_BOOLo.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

转载于:https://www.cnblogs.com/luxishi/p/7419025.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语语法学习2--句子的成分

句子成份 词语和句子,就象是个人与家庭之间的关系一样,家庭是有个人组成的,家庭带来的幸福和责任都随着成员的增加而几何倍数的递增。 但是个人绝对不能脱离家庭。一个没有家庭概念的人注定活着没有什么意义。 现在我们聊一下,词语…

DataTables获取指定元素的行数据

https://www.cnblogs.com/hdwang/p/7126796.html 看上帖,没有看懂 看官网 https://datatables.net/examples/ajax/null_data_source.html 好像看懂,待测试。 响应式处理: https://datatables.net/extensions/responsive/ 实测代码 &l…

[LeetCode] Power of Two 判断2的次方数

Given an integer, write a function to determine if it is a power of two. Example 1: Input: 1 Output: true Example 2: Input: 16 Output: true Example 3: Input: 218 Output: false 这道题让我们判断一个数是否为2的次方数,而且要求时间和空间复杂度都为常数…

【电路补习笔记】9、电容式开关电源(电荷泵)

目录分类原理电荷泵基础开关电容稳压器的细调功能电荷泵的电压增益调节输出电容(Co)优点电容式开关稳压器减小纹波相关应用老师的主页:唐老师讲电赛 视频地址: 电源大师3——电容式开关电源(电荷泵)工作原理…

CPU 硬盘性能到底相差多少

本文以一个现代的、实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度——延迟和数据吞吐量。通过粗略的估算PC各个组件的相对运行速度,希望能给大家留下一个比较直观的印象。本文中的数据来自…

Datatables 构建响应式

https://datatables.net/extensions/responsive/

【电路补习笔记】10、电感式开关电源(BUCK 降压电路)

目录分类封装焊线式覆晶式开关电源三种基本的非隔离开关电源纹波(ripple)开关电源的元件构成有源开关肖特基二极管或快恢复二极管不使用普通硅二极管的原因电感电容分压电阻(输出电压设置)工作原理工作模式连续模式(co…

php中Session的生成机制、回收机制和存储机制探究

转载:http://www.jb51.net/article/53938.htm这篇文章主要介绍了php中Session的生成机制、回收机制和存储机制探究,可以帮助大家对Session有一个全面的了解,需要的朋友可以参考下1、php中session的生成机制我们先来分析一下PHP中是怎么生成一个session的。设计出session的目的是…

FFT(模板)

优美 这里写代码片 #include<cstdio> #include<cstring> #include<iostream> #include<cmath>using namespace std;const int N301000; const double piacos(-1.0); struct node{double x,y;node (double xx0,double yy0){xxx;yyy;} }; node a[N],b[N]…

iPhone使用CoreTelephony获得SIM卡网络运营商资讯和通话资料

注意要加头文件目录 /System/Library/Frameworks/CoreTelephony.framework/Headers 到 build 设置 Header Search Paths&#xff0c;并在使用到这些类中加头文件&#xff0c;例如1. #import "CTCarrier.h" 2. #import "CTTelephonyNetworkInfo.h" iOS 4.0 …

datatables隐藏列设置及获取隐藏列的值

https://blog.csdn.net/bingguang1993/article/details/84649674

wsl2 Ubuntu 18.04 安装 ROS

目录前期准备安装ROS初始化rosdep测试前期准备 WSL的安装见旧版 WSL 的手动安装步骤从步骤4开始弄。 图形界面安装见在WSL中使用GPU&#xff1a;WSL2 Ubuntu 18.04 CUDA Gnome图形界面环境配置 界面汉化见WSL-Ubuntu安装中文语言 这里使用鱼香ROS大佬的一键安装脚本&…

Udi Dahan对于业务逻辑重用以及微服务方面的观点

今年的DDD Exchange大会在伦敦如期举行&#xff0c;Udi Dahan在大会上的一场演讲中从一种不同的角度对业务逻辑进行了剖析。他表示&#xff1a;近三十年来&#xff0c;重用已经成为了一种口号&#xff0c;它几乎可以套用在系统开发中的每一个环节上。但重用其实是一种砒霜&…

微软移除Visual Studio 2015中的UML

微软已经在Visual Studio 2015中移除了UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;&#xff0c;原因是该语言使用率过低。因此微软要优化产品结构&#xff0c;把好钢用在刀刃上。 Visual Studio高级产品经理Jean-Marc Prieur表示&#xff0…

GPU CUDA 经典入门指南

转自&#xff1a;http://luofl1992.is-programmer.com/posts/38830.html CUDA编程中&#xff0c;习惯称CPU为Host&#xff0c;GPU为Device。编程中最开始接触的东西恐怕是并行架构&#xff0c;诸如Grid、Block的区别会让人一头雾水&#xff0c;我所看的书上所讲述的内容比较抽象…

Jquery创建动态表单

$(document).ready(function(){$("#button1").click(function(){//获取html <body></body>的Jquery对象var body $("body");//创建表单var form $("<form></form>");//将表单放入body中body.append(form);//设置表单各…

用PyQt实现透明桌面时钟小部件

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # -*- coding: utf-8 -*-Created on 2012-4-6author: wangxiaoimport sys from PyQt4 import QtGui, QtCore from PyQt4.QtCore import Qt from PyQt4.QtCore import QPoint from PyQt4.QtCore…

实现织梦dedecms百度主动推送(实时)网页抓取

做百度推广的时候&#xff0c;如何让百度快速收录呢&#xff0c;下面提供了三种方式&#xff0c;今天我们主要讲的是第一种。 如何选择链接提交方式 1、主动推送&#xff1a;最为快速的提交方式&#xff0c;推荐您将站点当天新产出链接立即通过此方式推送给百度&#xff0c;以保…

高性能CSS(一)

避免使用import 有两种方式加载样式文件&#xff0c;一种是link元素&#xff0c;另一种是CSS 2.1加入import。而在外部的CSS文件中使用import会使得页面在加载时增加额外的延迟。虽然规则允许在样式中调用import来导入其它的CSS&#xff0c;但浏览器不能并行下载样式&#xff0…

【RK3399Pro学习笔记】十八、点亮LED灯(python、C语言、bash)

目录GPIOpython3python-peripherypython2RPiC语言SysFs方式编写gpiolib.cgpiolib.hmain.c编译测试wiringPibash平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 GPIO (机翻)下表显示了座子的引脚&am…