【Unity Shader】---入门知识点
着色器声明(“名字”)
Shader "ShaderDiffuseExample"
{
一、属性定义(作用:外部传入参数)
属性定义语法:PropName("DisplayName",PropType) = DefaultValue[{options}]
Properties
{
PropName:属性名,就是当前Shader的外部传入数据变量名。
DisplayName:Unity材质编辑器中显示的参数名,可作为脚本传参时的Key来给属性赋值。
PropType:属性的类型,UnityShader可用的类型有:
Color:颜色,有RGBA四个量来定义。
2D:一个二阶(2的n次幂像素)大小的贴图,这张纹理将在被采样后按照模型顶点UV进行颜色赋值。
Rect:一个非二阶贴图。
Cube:即为Cube map texture(立方体纹理);立方体纹理是有6张有关系的2D贴图的组合,
主要用做反射效果(比如天空盒和动态反射),也会被按照对应坐标采样。
Range(min,max):一个介于最小于最大值之间的浮点数
Float:任意一个浮点数
Vector:任意一个四维数
DefaultValue:属性默认初始值(当然这些值也是可以在后期用代码进行再赋值)
Color 格式为(1,1,1,1)
Rect 2D Cube可以用默认代表tini颜色的字符串 + {}:例如"white" "black" "gray" "bump"
Float Range 为浮点数值
Vector 格式为(x,y,z,w)
{options} :只针对于Rect 2D Cube会有的{},在他们初始值后面必须加上一个{},当我们有特点选项时就写在{}里面
选项有:ObjectLiner EyeLiner SphereMap CubeReflect CubeNormal(这些都是OpenGL中TexGen的模式)
}
二、子着色器(可以有多个子着色器)
(1)shader分为四种:
1、Fixed function shader 固定着色器
2、Vertex shader 和 Fragment shader 定点着色器和片段着色器
3、Surface shader 表面着色器
4、Compute shader 这是Unity3D新增的一种。看下度娘百科对它的介绍
(2)前三种shader不同点:
1、Vertex shader、Fragment shader、Surface shader可以实现Fixed function shader实现不了的高级功能
2、Vertex shader、Fragment shader、Fixed function shader 的shader主体中有pass{};但是Serface shader
已经把相关内容打包在了光照模型里了,不能有pass{}。
3、Fixed function shader每句代码后面不需要加";" 另外2种shader必须要加";"
4、它们的核心结构不同:
Fixed function shader核心结构是 Material{} 以及 SetTexture[_MainTex]{}
Surface shader 核心结构是
①使用Unity自带光照模型LightModel(如Lambert),也不顶点处理,只需要一个函数surf处理即可。
CGPROGRAM
#pragma surface surf Lambert
ENDCG
②使用自己写的光照模型LightModel,并且使用顶点处理函数vert
CGPRORAM
// surface 表面处理函数 光照模型 顶点处理:函数
#pragma surface surf lightModel vertex : vert
//执行顺序:顶点处理函数->表面处理函数->光照模型函数->颜色值
ENDCG
Vertex shader 和 Fragment shader 核心结构是
CGPROGRAM
#pragma vertex vert
#prgrma fragment frag
#include "Unity.cginc"
ENDCG
SubShader
{
1、Tags修饰:硬件将通过判断定义的这些标签来决定什么时候调用该着色器。Tags其实暗示了Shader的输出
"RenderType" = "opaque" :在渲染非透明物体时调用
"RenderType" = "opaque" :在渲染透明物体时调用
"IgnorProjector" = "True" : 不被Projector影响
"ForceNoShadowCasting" = "True" : 从不产生阴影
"Queue" = "xxx" : 指定渲染队列(渲染优先级),预定义的Queue有:
Backgroud = 1000最早被调用的渲染(用于天空盒或者背景)
Geometry = 2000 默认值,用来渲染非透明物体(场景中大部分都是用这个)
AlphaTest = 2450 用来渲染经过AlphaTest的像素(单独为AlphaTest设定一个Queue是出去效率的考虑)
Transparent = 3000 以从后往前的顺序渲染透明物体
Overlay = 4000 用来渲染叠加效果,是渲染的最后阶段(例如渲染镜头光晕特效)
附:除了用以上预定义的值,还可以自己定义Queue值(如 "Queue" = Transparent + 100,表示在Transparen之后100的Queue上调用)
例子:Tags{"RenderType" = "opaque"}
2、LOD值:它是Level of Detail的缩写,其实Unity的内建Diffuse着色器的设定值就是200。
这个数值决定了我们能用什么样的Shader。在Unity的Quality Settings中我们可以设定允许的最大LOD,
当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用。
Unity内建Shader定义了一组LOD的数值,我们在实现自己的Shader的时候可以将其作为参考来设定自己的LOD数值,
这样在之后调整根据设备图形性能来调整画质时可以进行比较精确的控制。
VertexLit及其系列 = 100
Decal, Reflective VertexLit = 150
Diffuse = 200
Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
Bumped, Specular = 300
Bumped Specular = 400
Parallax = 500
Parallax Specular = 600
例子:LOD 200
3、CG程序的主体(必须被包含在CGPROGRAM ... ENDCG之间)
(1)表面着色器:#pragma surface surfaceFuction lightModel[optionalparams]
声明要写一个表面着色器,表面着色器函数名称及指定的光照模型[可附带参数]
#pragma 声明着色器关键字
surface 声明着色器类型为表面着色器
surfaceFuction 表面着色器函数名称
lightModel 使用的光照模型
#pragma target 3.0 表示编译UnityShaderModel版本
CGPROGRAM
#pragma surface surf Lambert
#pragma vertex vert
#pragma fragment frag
ENDCG
}
三、回滚(在以上所有子着色器都没能执行时执行回滚)
例子: FallBack "Diffuse"
}
【Unity Shader】---入门知识点的更多相关文章
- Unity Shader入门精要之 screen post-processing effect
本篇记录了学习Unity Shader入门精要的屏幕后处理的一些知识点. OnRenderImage(RenderTexture src, RenderTexture dest) 以上函数是Unity ...
- Unity Shader入门
Unity Shader入门 http://www.cnblogs.com/lixiang-share/p/5025662.html http://www.manew.com/blog-30559-1 ...
- Unity Shader入门精要读书笔记(一)序章
本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...
- 【我的书】《Unity Shader入门精要》出版上市
重要的事 先说重要的事,就是我的书籍<Unity Shader入门精要>在经过无数次跳票后,终于出版上市了(泪目-)! 购买传送门: 亚马逊 当当 京东 截止到我写这篇文章的时候,京东是没 ...
- Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘
转自 冯乐乐的<Unity Shader 入门精要> 2010年的Unity 3 中,Surface Shader 出现了. 表面着色器的一个例子. 我们先做如下准备工作. 1)新建一个场 ...
- Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术
转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...
- Unity Shader入门精要学习笔记 - 第15章 使用噪声
转载自 冯乐乐的 <Unity Shader 入门精要> 消融效果 消融效果常见于游戏中的角色死亡.地图烧毁等效果.这这些效果中,消融往往从不同的区域开始,并向看似随机的方向扩张,最后整个 ...
- Unity Shader入门精要学习笔记 - 第14章非真实感渲染
转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...
- Unity Shader入门精要学习笔记 - 第11章 让画面动起来
转自 冯乐乐的 <Unity Shader入门精要> Unity Shader 中的内置变量 动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时画面也可以随之变化.Unity ...
- Unity Shader入门精要学习笔记 - 第10章 高级纹理
转载自 冯乐乐的 <Unity Shader入门精要> 立方体纹理 在图形学中,立方体纹理是环境映射的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层 ...
随机推荐
- wpf textbox ctrl+enter事件
<TextBox x:Name="xcontent" Text="sfasdf" Grid.Row="0" AcceptsReturn ...
- ls, dir, vdir - 列目录内容
ls [选项] [文件名...] POSIX 标准选项: [-CFRacdilqrtu1] GNU 选项 (短格式): [-1abcdfgiklmnopqrstuxABCDFGLNQRSUX] [-w ...
- pandas处理字符串
# pandas 字符串的处理 # 前面已经学习了字符串的处理函数 # df["bWendu"].str.replace("℃","").a ...
- 浅谈C++ allocator内存管理(对比new的局限性)(转)
STL中,对内存管理的alloc的设计,迫使我去学习了allocator类.这里对allocator内存管理做了点笔记留给自己后续查阅.allocator类声明.定义于头文件<memory> ...
- Python---进阶---logging---logger
一.####用logging的四大组件来实现日志的功能 - 打印出函数执行的时间,日志的等级,日志的消息 - 用装饰器 - 不同的日志,要记录不同等级的日志消息 ------------------- ...
- mongodb replica set搭建
1/安装mongodb 配置repo: [mongodb-org-3.4]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/red ...
- SQL Server2008收缩日志文件
查询状态语句: SELECT name,log_reuse_wait_desc FROM sys.databases where name='hrsystem'; 收缩日志文件: USE [maste ...
- [window] Pyhton轻便好用的spyder IDE如何去除E501 line too long提示
spyder 使用pep8作为代码规范的标准,默认单行长度是89个字符以内. 作为一个完美控,在使用spyer有的进行coding时,每当看到以下这个小小的warning时,心情都不是很爽: 89个字 ...
- 【CF1251E】Voting(贪心)
题意:有n个人,需要搞到全部n个人的票,搞到第i个人的票有两种方式:之前已经搞到mi个人的票,或者直接花费pi 问最小的搞到所有票的总代价 n<=2e5,1<=p[i]<=1e9,0 ...
- 170817关于Listener的知识点
1. Listener 监听器简介 Listener是JavaWeb中三大组件之一.Servlet.Filter.Listener ...