打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Unity shader教程-第二课:Shader的框架和Properties详细介绍


本文首发地址:http://98jy.net/article/17

更多更及时的文章可在上述地址看到


一、Shader的框架



shader由关键字Shade加上后面的用双引号括起来的字串开始,字串里面可以用上/表示在Inspector中显示出来的分类。整个shader代码都包在这个部分后面的{}中。举例来说,一个典型的shader会是这样


Shader "Name"{}或者Shader "Category / Name"{}


二、Shader中的属性(properties)



在unity中,一个shader的属性非常重要,因为属性可以让美术人员或者用户不用会代码就能添加材质、改动数值从而改变shader的显示。属性通过在Inspector面板上提供出相关的控件出来,可以可视化的、所见即所得的实现对相关的shader行为的修改。


为了方便,我们把上一节课的shader代码贴在下面:


Shader "CookbookShaders/BasicDiffuse"{	Properties	{		_MainTex ("Base (RGB)", 2D) = "white" {}	}		SubShader	{		Tags { "RenderType"="Opaque" }		LOD 200				CGPROGRAM		#pragma surface surf Lambert				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;		}		ENDCG	}	FallBack "Diffuse"}
从第3行的Properties开始到第6行位置,我们把这个块叫做“属性代码块”。当前,它只有一个属性:_MainTex。如果你在Unity中选中应用了我们这个shader的material,你可以在inspector面板上看到一个可供选择图片的控件,如下图:



你可以通过右下角的select这个按钮来选取工程里的图片,也可以把图片从project面板中直接拖到select所在的框里面。这里的这个控件框(包含它左手边的Base(RGB)等),都是shader中的代码Properties { _MainText ... } 让Unity为我们自动生成出来的。


因此,我们可以使用Unity的这个方法,尽量把shader需要的外部“变量”作为属性传给shader,这样就减少了代码的改动量。


动手实验


用MonoDevelo打开我们的第一个shader,从Properties中去除原来的这一行:

_MainText  ("Base (RGB)", 2D) = "White" {}

然后加入下面的代码,保存

_EmissiveColor ("Emissive Color", Color) = (1, 1, 1, 1)

回到Unity中等待Unity编译完我们的shader。请保证你是选中的应用了我们的shader的material,Inspector面板会变成下图,点击图中的白色部分会弹出对话框供我们选择不同的颜色。

再回到shader代码中,我们再加入这么一行代码:

_SomeValue("Some Value", Range(0, 10)) = 2

相关面板会多出来一个滑动条出来,可以让我们左右滑动在一定范围内确定一个数值


Properties中代码的格式


每个Unity的shader都被Unity规定了一定的格式。Properties块就是其中的一个。这个块主要是给shader的程序员一个很方便的方式去让Unity帮助创建出符合你的代码的控件出来,而不用程序员去关心怎么显示(如果想,unity也提供了相应的方式让程序员自由发挥)。在Properties块中的代码,需要符合下面的格式:


“变量”这个名字,是在shader其他代码中会被引用,用来得到这个变量所对应的值。


“Inspector显示名”,是我们这个属性在Inspector面板上显示出来的名字。


“类型”是变量属于的种类,同时也决定了变量在Inspector面板上对应的控件。


“默认值”是变量的初始化值,相应的,它的写法也跟变量的类型有关。



下面的表格描述了在shader中我们可以用到的“类型”:

Range(min, max)

创建一个滑动条,可以让用户选择在min和max之间的浮点数值

Color创建一个调色板选择器,可以让用户选择颜色
2D创建一个图片选择框,可以让用户选择贴图
Rect创建一个non-power-of-2贴图选择框,功能基本跟2D想同
Cube

创建一个选择Cubmap的框

Float创建一个让用户填入浮点数的栏位
Vector

创建4个栏位,让用户可以填入相应的浮点数,代表一个Vecto4


然后看“默认值"的写法:


  • Range 和 Float,一个浮点数
  • Color 和 Vector,4个用逗号隔开的数字,用()包住。对应于Color,这四个是分别是R、G、B、A的归一化的值(数值范围从0到1,代表0到255这个常见的色彩值范围)。对应于Vector,是x、y、z、w值。
  • 2D, Rect 和 Cube,可以选择空的字符串或者Unity内部的默认贴图名字:"white", "black", "gray" 或"bump"

注意:

2D、Rect、Cube的默认值后面可以跟上{},类似这样的写法

name ("display name", 2D) = "name" { options }

这个部分是可选的。如果需要,这里的选择是两种模式:


  • TexGen texgenmode: 自动生成贴图的uv坐标。texgenmode参数可以是:ObjectLinearEyeLinearSphereMapCubeReflectCubeNormal都直接对应到OpenGL的texgen模式。如果用户用了自定义的顶点方法,那么TexGen会被unity忽略。
  • LightmapMode 指示unity,我们这里的图会从每个Rerderer组件中来,而不是直接在material中指定。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【Unity Shaders】Shader学习资源和Surface Shader概述
猫都能学会的Unity3D Shader入门指南(一)
【新提醒】【【Unity Shaders】学习笔记
使用Shader实现一个彩虹球效果!闪闪发光的特效离我又近了一步!
【新提醒】【大牛干货:100条Unity基础小贴士】
URP | 粒子系统Custom自定义数据控制溶解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服