着色器声明(“名字”)
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. C# wpf 列出文件夹所有文件

    在网上找了 cmd输入 dir "要列出的文件夹*.*" /a /b /s>"要输出的文件" 可以重定向把文件夹内容输出到文件 tree "要列 ...

  2. hdu 1059 Dividing bitset 多重背包

    bitset做法 #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a ...

  3. EffectiveC++01-03

    导读 作者Scott Meyers在如何有效运用C++方面给出了55个具体的做法,大致分为两类: 一般性的设计策略,集中于"如何在不同的做法中选择一种完成任务" 选择inherit ...

  4. [易学易懂系列|golang语言|零基础|快速入门|(三)]

    接下来,我们主要讲讲package. 先列举下go的package的一些核心特性: 1.go的package不局限于一个文件,组成一个package的多个文件,编译后实际上和一个文件类似,组成包的不同 ...

  5. ivew 封装删除 对话框

    封装的组件 <template> <Modal footer-hide :closable="false" title="删除确认" v-mo ...

  6. bzoj3754 Tree之最小方差树 最小生成树+推性质

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3754 题解 感觉这个思路挺神仙的. 后悔没有好好观察题目的数据范围,一直把 \(n\) 和 \ ...

  7. Python---面向对象---案例

    a = 5print(5/10)# 地板除(功能类似于数学模块当中floor()向下取整操作)print(5//10)print(a%10)b = 25print(b/10)print(b//10)p ...

  8. Spring配置文件出错

    问题描述: Element 'xxxxxxx' cannot have character [children],because the type's content type is element- ...

  9. Introduction of Generator in Python

    Python中生成器的原理与使用详解 原创牛大财有大才 发布于2018-09-05 14:36:38 0.range() 函数,其功能是创建一个整数列表,一般用在 for 循环中 语法格式:range ...

  10. 3D打印格式STL

    STL格式及其转换 近期接触了3D打印的一些东西,也制作了一个vrml转stl的插件,对该领域多了一些认识. 目前尚没有打印机直接支持stl.obj等格式,在打印之前需使用厂家提供的软件将stl等格式 ...