【Unity Shaders】学习笔记——SurfaceShader(一)认识结构
【Unity Shaders】学习笔记——SurfaceShader(一)认识结构
转载请注明出处:http://www.cnblogs.com/-867259206/p/5595747.html
写作本系列文章时使用的是Unity5.3。
写代码之前:
当然啦,如果Unity都没安装的话肯定不会来学Unity Shaders吧?
阅读本系列文章之前你需要有一些编程的概念。
在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这篇文章使代码高亮显示,也可以下载
shaderlabvs或NShader之类的插件使代码高亮显示。这是针对小白的Unity Shaders的基础知识,如果你已经有了基础或者你是大神,那么这些文章不适合你。
由于作者水平的局限,文中或许会有谬误之处,恳请指出。
现在我们就要正式开始写Unity Shaders了~
1. 新建Unity Project。
2. 在Assets文件夹下新建三个文件夹:Materials、Shaders、Textures。
3. 在Shaders文件夹下右键,Create-Shader-Standard Surface Shader,命名为MySurfaceShader。
4. 在Materials文件夹下新建Material,命名为MySurfaceShader,将它的Shader改为新建的Shader。
5. 新建一个Cube,将新建的材质赋给它。
如果你使用的是低于5.3的版本,你的右键菜单里不会有那么多种Shader,直接创建就好。直接创建的Shader代码和Standard Surface Shader不同,其实就是比Standard Surface Shader更为简化一点,听了解释你就会明白。
右键菜单里总共有四种Shader,分别是Standard Surface Shader、Unlit Shader、ImageEffect Shader、Compute Shader。
Unlit Shader和ImageEffect Shader都是Vertex&Fragment Shader,Compute Shader上一篇文章里讲过。
让我们打开MySurfaceShader看一看。
Shader "Custom/MySurfaceShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
第一行代码定义的是Shader在Unity里的路径,在Material的Shader选项的下拉列表里可以看到它,你随时都可以修改它。
最后一行表示前面的着色程序显卡不支持的时候就用默认的“Diffuse”。
Properties括号里的东西就是Shader的属性,打开Material的Inspector,你可以看见他们。语法就是:
变量名 (“检视面板里显示的名称”, 变量类型)= 默认值
注意啦,没有分号的。
这是Unity官网对Properties的介绍。
Unity支持的Properties类型如下:
Color :颜色 Inspector面板里会有一个选取颜色的picker
Range :某范围内的浮点数 Inspector面板里会出现一个Slider
2D :2D纹理
Rect :创建非2次方边长的纹理
Cube :创建Cube Map,也是一种纹理
Float :浮点数,和Range的区别就是Range是一个范围内的数,Float是单个数
Vector:向量 定义一个四元素的容器
SubShader是子着色器。Tags{}是标签。LOD是Level of Detail的缩写。Tag标签里通常可以指定“Queque”和“RenderType”的值。“Queque”指渲染顺序,有一些预定义的值,比如“BackGround”、“Geometry”等,可以自定义。“RenderType”是渲染类型,不透明物体用“Opaque”,透明物体用“Transparent”,还有一些其他的预定义的值,也可以自定义。
CGPROGRAM和ENDCG里面是CG程序。
#pragma surface surf Standard fullforwardshadowssurface说明是surface shader,可以换成Vertex或Fragment,surf是表面处理函数,在代码段的下面就有一个surf函数。Standard fullforwardshadows是光照模型函数。#pragma target 3.0设置编译目标Shader model的版本。
后面surf函数里的东西就是重点啦。
在surf函数的上面,将properties里的变量用相同的名称定义一遍。还有一个Input结构体,这是输入结构。
来看看surf函数里都做了什么吧。
先定义了一个4元的定点数c,tex2D是纹理采样函数,第一个参数是纹理,第二个参数是uv坐标,函数的返回值乘以颜色。o这个变量就是着色器会输出的变量,也就是存储着我们眼睛会看到的效果的变量。后面的语句的意思就是将各个值赋给o里的不同值。rgb就是RGB颜色,Albedo是反射值,Metalic是金属值,Smoothness是光滑值,Alpha是透明通道。其实英语好就能看懂这些变量的意思了。(原谅我的翻译)
如果是低于5.3的版本,o 变量的类型是SurfaceOutPut,这两种类型意思是一样的,只不过是不同的结构体。
如果是Standard fullforwardshadows光照模型,则对应用SurfaceOutputStandard,如果是Lambert光照模型(其他版本Unity默认的光照模型),则对应SurfaceOutput。
这就是一个surface shader程序的基本结构。
下一篇文章我会详细介绍CG的类型和Input、SurfaceOutPut这两个结构体。
【Unity Shaders】学习笔记——SurfaceShader(一)认识结构的更多相关文章
- 【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型
[Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698. ...
- 【Unity Shaders】学习笔记——SurfaceShader(十一)光照模型
[Unity Shaders]学习笔记——SurfaceShader(十一)光照模型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5664792.html ...
- 【Unity Shaders】学习笔记——SurfaceShader(七)法线贴图
[Unity Shaders]学习笔记——SurfaceShader(七)法线贴图 转载请注明出处:http://www.cnblogs.com/-867259206/p/5627565.html 写 ...
- 【Unity Shaders】学习笔记——SurfaceShader(六)混合纹理
[Unity Shaders]学习笔记——SurfaceShader(六)混合纹理 转载请注明出处:http://www.cnblogs.com/-867259206/p/5619810.html 写 ...
- 【Unity Shaders】学习笔记——SurfaceShader(五)让纹理动起来
[Unity Shaders]学习笔记——SurfaceShader(五)让纹理动起来 转载请注明出处:http://www.cnblogs.com/-867259206/p/5611222.html ...
- 【Unity Shaders】学习笔记——SurfaceShader(三)BasicDiffuse和HalfLambert
[Unity Shaders]学习笔记——SurfaceShader(三)BasicDiffuse和HalfLambert 转载请注明出处:http://www.cnblogs.com/-867259 ...
- 【Unity Shaders】学习笔记——SurfaceShader(十)镜面反射
[Unity Shaders]学习笔记——SurfaceShader(十)镜面反射 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以. 水 ...
- 【Unity Shaders】学习笔记——SurfaceShader(九)Cubemap
[Unity Shaders]学习笔记——SurfaceShader(九)Cubemap 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以 ...
- 【Unity Shaders】学习笔记——SurfaceShader(八)生成立方图
[Unity Shaders]学习笔记——SurfaceShader(八)生成立方图 转载请注明出处:http://www.cnblogs.com/-867259206/p/5630261.html ...
随机推荐
- 使用Cyclone IV控制DDR2
根据你的DDR2手册配置好megacore,megacore会生成一个example top: 在quartus中运行megacore生成的xxx_pin_assignments.tcl,指定DDR2 ...
- php计算字符串长度:utf8编码,包含中文
php计算字符串长度:utf8编码 中文当作1个字符处理(strlen默认当作两个字符) 上函数: /** * 计算 UTF-8 字符串长度 * * @param string $str * @ret ...
- js封常用类
ajax刷 下拉框联动 /*基础初始化类*/ $.EBC = { setCourse:function(obj){ $(obj).empty(); $.get('../Index/getCoursei ...
- erlang接入远程shell
两种方式 erl -name aaa@127.0.0.1 -setcookie erl -name bbb@127.0.0.1 -setcookie ctrl + g进入jcl模式 h查看帮助 r ' ...
- Makefile编译选项CC与CXX/CPPFLAGS、CFLAGS与CXXFLAGS/LDFLAGS
转自:http://www.firekyrin.com/archives/597.html 编译选项 让我们先看看 Makefile 规则中的编译命令通常是怎么写的. 大多数软件包遵守如下约定俗成的规 ...
- 对象生命周期及crud操作
1. 对象状态及生命周期 瞬时状态: 持久状态: 游离状态: 2. new->save->close->update public void testSave(){ Session ...
- [ Iptables ] Linux开启防火墙,切记仔细确定每个端口
一.缘由: 祸起Redis未授权访问漏洞被利用,删除了服务器的所有账号,导致无法登陆:这才不得不把开启防火墙提上日程.再次在开启防火墙过程中,一刀切造成了一些前段进程的端口被封,甚是后悔! 二.解决办 ...
- memcache 内部原理实现
Lazy Expiration memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期.这 种技术被称为 lazy(惰性)expiration.因此,mem ...
- mrp功能分类
mrp主要有六大功能子系统:[工程管理子系统].[销售管理子系统].[计划管理子系统].[采购管理子系统].[库存管理子系统].[MRP运行管理子系统].[工程管理子系统]主要功能:产品/物料编码表. ...
- 转载__Android开源项目(二)
http://www.csdn.net/article/1970-01-01/2815145 GitHub上的开源项目不胜枚举,通过这些项目,也能让开发者在应用开发过程中事半功倍,作为开发者的你,在用 ...