着色器声明(“名字”)
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】---入门知识点的更多相关文章

  1. Unity Shader入门精要之 screen post-processing effect

    本篇记录了学习Unity Shader入门精要的屏幕后处理的一些知识点. OnRenderImage(RenderTexture src, RenderTexture dest) 以上函数是Unity ...

  2. Unity Shader入门

    Unity Shader入门 http://www.cnblogs.com/lixiang-share/p/5025662.html http://www.manew.com/blog-30559-1 ...

  3. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

  4. 【我的书】《Unity Shader入门精要》出版上市

    重要的事 先说重要的事,就是我的书籍<Unity Shader入门精要>在经过无数次跳票后,终于出版上市了(泪目-)! 购买传送门: 亚马逊 当当 京东 截止到我写这篇文章的时候,京东是没 ...

  5. Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘

    转自 冯乐乐的<Unity Shader 入门精要> 2010年的Unity 3 中,Surface Shader 出现了. 表面着色器的一个例子. 我们先做如下准备工作. 1)新建一个场 ...

  6. Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术

    转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...

  7. Unity Shader入门精要学习笔记 - 第15章 使用噪声

    转载自 冯乐乐的 <Unity Shader 入门精要> 消融效果 消融效果常见于游戏中的角色死亡.地图烧毁等效果.这这些效果中,消融往往从不同的区域开始,并向看似随机的方向扩张,最后整个 ...

  8. Unity Shader入门精要学习笔记 - 第14章非真实感渲染

    转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...

  9. Unity Shader入门精要学习笔记 - 第11章 让画面动起来

    转自 冯乐乐的 <Unity Shader入门精要> Unity Shader 中的内置变量 动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时画面也可以随之变化.Unity ...

  10. Unity Shader入门精要学习笔记 - 第10章 高级纹理

    转载自 冯乐乐的 <Unity Shader入门精要> 立方体纹理 在图形学中,立方体纹理是环境映射的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层 ...

随机推荐

  1. 内存缓存的使用Demo

    使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...

  2. 中国各个省市县的人口统计,echart展示

    公司要做一个excel形式的人口统计表,我感觉应该更直观一些展示,所以就选用了echart进行展示,由于时间短所以制作的比较简单粗糙,但相应的数据还是有很大的可参考性. 刚好下载了jfinal3.5, ...

  3. locale - 地域定义文件的描述

    描述 地域 定义文件含有 localedef(1) 命令所需的全部信息. 定义文件由几个小节组成, 一个小节详细地描述地域的一个范畴. 语法 地域定义文件以一个包含有如下关键字的文件头开头: < ...

  4. VMware虚拟机NAT模式无法上外网

    VMware虚拟机NAT模式无法上外网排错思路 1,确保三种模式只有一种在连接 2,确保ip配置正确 配置的子网跟DHCP必须是同一网段 3,确保网关配置正确 网关不管怎么配,一定不要配192.168 ...

  5. P3833 [SHOI2012]魔法树 (树链剖分模板题)

    题目链接:https://www.luogu.org/problem/P3833 题目大意:有一颗含有n个节点的树,初始时每个节点的值为0,有以下两种操作: 1.Add u v d表示将点u和v之间的 ...

  6. activity manager

    首先 activity manager 作为一个独立的服务存在,所有系统中的所有 app 的 activity 都通过这个 service 来管理 同时 activity manager 维护着多个 ...

  7. java初学第一天

    public class HellowWorld{ public static void main(String[] args){ System.out.println("jiuxu&quo ...

  8. 【NOIP2015模拟11.3】IOIOI卡片占卜

    题目 K理事长很喜欢占卜,经常用各种各样的方式进行占卜.今天,他准备使用正面写着"I",反面写着"O"的卡片为今年IOI的日本代表队占卜最终的成绩. 占卜的方法 ...

  9. java浅克隆和深克隆,序列化和反序列化实现深克隆(封装序列化和反序列化操作)

    本篇博客内容: 一.浅克隆(ShallowClone)和深克隆(DeepClone) 二.序列化和反序列化实现深克隆 三.封装序列化和反序列化操作 ObjectOutputStream + 内存流By ...

  10. 简单说说JavaBean的使用

    一:JavaBean定义 JavaBean是一种可重复使用.跨平台的软件组件.JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean,例如中的那些可视化图 ...