着色器声明(“名字”)
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. [七月挑选]windows上面的发音

    title: windows上面的发音 开始 love.vbs: CreateObject("SAPI.SpVoice").Speak "I love YOU" ...

  2. Linux学习--第四天--find、locate、帮助命令、grep、who、w、压缩命令、网络命令、mount

    find 命令格式:find 搜索范围 匹配条件find 搜索范围 匹配条件(搜索范围一定要填写,不写默认为当前文件夹,不包括子文件夹.) find /etc -name init #搜索文件和文件夹 ...

  3. 长沙理工大学第十二届ACM大赛-重现赛 D 小M和天平 (01背包)

    链接:https://ac.nowcoder.com/acm/contest/1/D 来源:牛客网 小M和天平 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言 ...

  4. 神经风格转换 (Neural-Style-Transfer-Papers)

    原文:https://github.com/ycjing/Neural-Style-Transfer-Papers Neural-Style-Transfer-Papers Selected pape ...

  5. spring security There was an unexpected error (type=Forbidden, status=403).

    https://blog.csdn.net/qq_27093097/article/details/83190240 spring security There was an unexpected e ...

  6. Arduino-舵机

    舵机一般都外接三根线,一般棕色为接地线(GND),红色为电源正极线(VCC),橙色为信号线(PWM). 用Arduino控制舵机的方法有两种: 一种是通过Arduino的普通数字传感器接口产生占空比不 ...

  7. 【leetcode】540. Single Element in a Sorted Array

    题目如下: 解题思路:题目要求时间复杂度是O(logN),可以尝试使用二分查找法.首先数组是有序的,而且仅有一个元素出现一次,其余均为两次.我们可以先找到数组最中间的元素,记为mid.如果mid和mi ...

  8. js 获取滚动位置,滚动到指定位置,平滑滚动

    1.获取当前滚动条位置信息 var top = dom.scrollTop; // 获取y轴上的滚动位置 var left = dom.scrollLeft; // 获取x轴上的滚动位置 2.滚动到指 ...

  9. A1011

    找最大的,然后按规定计算后输出. 没啥可说的,除非犯了愚蠢的错误(比如把j写成i这种),按题目要求写就是了. #include<cstdio> int main(){ ]={'W','T' ...

  10. CSS-动画,让图片上的图形有涨起来的效果(逐渐变高)和(逐渐变长)

    效果图: html: <div class="inner3"> <div class="over"> <img src=" ...