Unity5增加了一个叫MaterialPropertyDrawer的东西,可以使用它们标记在shader的Properties里面,扩充shader的一些参数在编辑器上的样式。

本文以Shader山下(十一)纹理混合中的shader为例子,来介绍一下这些标记。

Shader "Custom/Frag/Blend" {Properties {_MainTex ("Albedo (RGB)", 2D) = "white" {}_BlendTex ("Blend Texture", 2D) = "white" {}_Opacity ("Blend Opacity", Range(0, 1)) = 1[Space(50)][Header(MaterialPropertyDrawer)][KeywordEnum(None, Add, Multiply, Screen)] _BlendMode ("Blend Mode", Float) = 0
//      [Enum(None, 0, Add, 1, Multiply, 2, Screen ,3)] _BlendMode ("Blend Mode", Float) = 0[Space][Toggle] _Invert ("Invert?", Float) = 0[Toggle(ENABLE_DOUBLE)] _Double ("Double?", Float) = 0[PowerSlider(3.0)] _Power ("Power", Range(1,1024)) = 1}SubShader {Tags { "RenderType"="Opaque" }LOD 200Pass{CGPROGRAM#pragma vertex vert_img#pragma fragment frag#pragma fragmentoption ARB_precision_hint_fastest#include "UnityCG.cginc"uniform sampler2D _MainTex;sampler2D _BlendTex;fixed _Opacity;int _BlendMode;bool _Invert;bool _Double;fixed4 getBlended(fixed4 renderTex, fixed4 blendTex){fixed4 blended;switch (_BlendMode){case 0:blended = renderTex;break;case 1:blended = renderTex + blendTex;break;case 2:blended = renderTex * blendTex;break;case 3:blended = (1.0 - ((1.0 - renderTex) * (1.0 - blendTex)));break;}if (_Invert){blended = 1 - blended;}if (_Double){blended *= 2;}return blended;}fixed4 frag(v2f_img i) : COLOR{fixed4 renderTex = tex2D(_MainTex, i.uv);fixed4 blendTex = tex2D(_BlendTex, i.uv);fixed4 blended = getBlended(renderTex, blendTex);renderTex = lerp(renderTex, blended, _Opacity);return renderTex;}ENDCG}}FallBack "Diffuse"
}

我们的材质编辑器就变成了这样:

首先是space标记,可以带参数也可以不带。不带参数时,默认产生如图中Blend Mode与Invert?之间的距离。

然后是Header标记,产生了一行加粗的文本,要注意参数不能加引号,包括后面的一些标记(一个奇怪的设定)。

KeywordEnum是产生一个下拉框

对应数值从0开始保存到_BlendMode里面。修改这些值,就会出现Shader山下(十一)纹理混合中各种不同的混合效果。

并且在这里,它跟被注释掉的哪一行Enum是等同的。而Enum与之区别在于,设置的数值可以不是连续并有序的。

Enum最多支持7对值,而KeywordEnum最多支持9个值。

Toggle会创建一个开关,把bool值保存到_Invert和_Double里面,至于带参数和不带参数之间的区别,我们稍后会讲到。

最后一个PowerSlider只做展示用,它创建了一个指数增长的滑动条,我们可以把值改为512:

你会发现本来应该在中间位置的滑动按钮跑到了右边。

其实还有另外一种形式可以使用,增加下面这些代码:

         #pragma shader_feature _INVERT_ON#pragma shader_feature ENABLE_DOUBLE#pragma multi_compile _BLENDMODE_NONE _BLENDMODE_ADD _BLENDMODE_MULTIPLY _BLENDMODE_SCREENfixed4 getBlendedMacro(fixed4 renderTex, fixed4 blendTex){fixed4 blended;#if _BLENDMODE_NONEblended = renderTex;#elif _BLENDMODE_ADDblended = renderTex + blendTex;#elif _BLENDMODE_MULTIPLYblended = renderTex * blendTex;#elif _BLENDMODE_SCREENblended = (1.0 - ((1.0 - renderTex) * (1.0 - blendTex)));#endif#if _INVERT_ONblended = 1 - blended;#endif#if ENABLE_DOUBLEblended *= 2;#endifreturn blended;}

并把frag方法里面获取混合色彩值的方法改为:

fixed4 blended = getBlendedMacro(renderTex, blendTex);

结果是等效的。

其中_INVERT_ON对应于[Toggle] _Invert,命名规则是变量名的大写形式+_ON。

ENABLE_DOUBLE对应于[Toggle(ENABLE_DOUBLE)] _Double ,ENABLE_DOUBLE替换了_DOUBLE_ON(再声明这个宏也是没用的)。

_BLENDMODE_NONE _BLENDMODE_ADD _BLENDMODE_MULTIPLY _BLENDMODE_SCREEN对应于[KeywordEnum(None, Add, Multiply, Screen)] _BlendMode,命名规则为变量名的大写形式+枚举名的大写形式。

而需要注意的是,Enum标记无法使用这些宏。

最后看看材质效果(貌似并没有什么意义)

(Blend Model=Screen,Invert?=On,Double?=On,Power=whatever)

Shader山下(十二)材质属性绘制器相关推荐

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

    2019独角兽企业重金招聘Python工程师标准>>> Shader山下(二十)编译指令(Compilation Directives)介绍了如何使用编译指令,本文就专文介绍一下多重 ...

  2. Mr.J-- jQuery学习笔记(三十二)--jQuery属性操作源码封装

    扫码看专栏 jQuery的优点 jquery是JavaScript库,能够极大地简化JavaScript编程,能够更方便的处理DOM操作和进行Ajax交互 1.轻量级 JQuery非常轻巧 2.强大的 ...

  3. 十二、G1垃圾收集器

    G1收集器是一款面向服务器的垃圾收集器,也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命.为什么对G1收集器给予如此高的期望呢?既然对G1收集器寄予了如此高的期望,那么他一定是有特 ...

  4. Shader山下(八)片段着色器

    Shader可以分为两类: 表面着色器(Surface Shader) - 为你做了大部分的工作,只需要简单的技巧即可实现很多不错的效果,但也显示了部分功能. 片段着色器(Fragment Shade ...

  5. Shader山下(二十八) 切空间

    以下摘录自<Unity 3D ShaderLab开发实战详解>,18.1. 如果要理解法线贴图的用法,就要知道Tangent Space,即切空间.什么是切空间?想象一下这样一个假设的情形 ...

  6. 【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )

    文章目录 一.设置线宽度 二.绘制单条线段 GL_LINES 三.绘制多条线段 GL_LINES 四.绘制依次连接的点组成的线 GL_LINE_STRIP 五.绘制圈 GL_LINE_LOOP ( 偶 ...

  7. Shader山下(二十七)平面阴影

    以下摘录自<Unity 3D ShaderLab开发实战详解>,第10章. 转注:这是一个非常简单且廉价的实时假阴影,比较常用到,据我所知,王者荣耀中就使用了类似的手法.缺点就是比较假,只 ...

  8. C++实例(十二)图形绘制

    一.特殊曲线 绘制蜗牛线 绘制贝塞尔曲线 拖动绘制曲线 绘制正弦曲线 绘制立体模型 交叉线条 绘制尼哥米德蚌线 艺术图案万花筒 绘制抛物线 等电位面图 沙丘图案 绘制艺术图案 立体三棱锥 二.图形基础 ...

  9. 十二、Powerbi绘制人员地区分布图和后期学习

    @Author : By Runsen @Date : 2020/5/13 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘 ...

最新文章

  1. 【杂谈】当当最新购书优惠来了,满300-60,AI好书推荐
  2. java中日期怎么_Java 中的日期处理
  3. 欢迎加入Hello China技术讨论群组-QQ群:38467832
  4. QQ浏览器怎么把文件添加到私密空间 怎么使用私密空间
  5. 微课|Python三种方法统计各分数段内的人数(17分钟)
  6. 【报告分享】2021年95后医美人群洞察报告:颜值经济,95后“美力”来袭.pdf(附下载链接)...
  7. mysql实现俩个属性加减运算_1.3 算数运算符
  8. 2345 网址导航劫持 解决办法
  9. fw136r虚拟服务器,Purley平台Redfish带外配置表
  10. 汽车租赁管理系统(java)--隔壁小河
  11. Tomcat后台管理
  12. 第三方支付API支付宝支付申请流程 支付宝新老版本
  13. 迅捷路由器设置找不到服务器,迅捷(fast)路由器怎么设置?
  14. python程序设计黄锐军_Python程序设计
  15. 每日好店——淘宝店铺推荐系统实践
  16. SSM思想—阶段性总结
  17. 设备信息之硬盘序列号、设备序列号、操作系统安装时间、IP地址
  18. Unity接入OneStore内购
  19. R语言caret机器学习(一)数据可视化:绘制特征变量图
  20. OpenGL(可编程管线):Bezier曲面

热门文章

  1. SAP 联产品 副产品
  2. STM32F1做RSA,AES数据加解密,MD5信息摘要处理
  3. **3DSlicer**之Python脚本储存库翻译_10.Markups(1)
  4. 标签内容上下居中java_li 标签中放a 标签,文字垂直居中
  5. python驱动级模拟按键_Python实现windows下模拟按键和鼠标点击的方法
  6. 非计算机专业本科毕业如何迅速成长为一名算法工程师
  7. 点云去噪-双边滤波-matlab实现-2021-7-26-
  8. 扫地机器人作文说明文提纲_扫地机器人作文说明文600字
  9. 云服务器环境搭建(详细教程)——安装JDK环境、TomCat服务器、MySQL数据库
  10. 马小看前端(关于uni-app介绍)