//U3D用的shader语言叫ShaderLab,基础语法官方文档地址
//https://docs.unity3d.com/Manual/SL-Shader.html
//开头指明名字,可以在别的shader中通过名字调用该shader的Pass什么的
//UsePass "ShaderName/PassName"
Shader "ShaderName"
{
//属性定义
Properties
{
[DisplayType]_Name("Display Name", type) = defaultValue {options}
[DisplayType]_Name("Display Name", type) = defaultValue {options}
//改Shader暴露的参数,在需要使用的Pass的CG代码段里需要重新声明一次 //type包括
// Color 一种颜色,由RGBA四个量来定义
// 2D 一张2的阶数大小(256,512之类)的贴图。
// Rect 一个非2阶数大小的贴图
// Cube 即Cube map texture(立方体纹理)
// Float 任意一个浮点数
// Vector 一个四维数
// Range(min, max) 一个介于最小值和最大值之间的浮点数 //defaultValue
//color 的是 (0,0,0,0)
//Rrct 的是 "white" {} //{option}: 它只对2D,Rect或者Cube贴图有关,最少一对什么都不含的空白的{},
// 选项(多个选项,可以使用空白分隔): ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal中的一个 //DisplayType可选,告诉编辑器如何显示这个属性,常见的类型
// [Toggle] Display as a toggle
// [Enum(One,1,SrcAlpha,5)] 展示位枚举
// 共有两种自定义界面的方式,详细见自定义编辑界面笔记 //在自定义函数部分中可以用[name]的方式使用 比如 Blend [_SrcBlend] [_DstBlend]
//Properties块定义的参数是给材质球用的,用代码的方式可以有更多类型的参数,但不能被保存下来
} //子着色器,可以包含多个,根据不同的条件选择一个执行(硬件条件之类的)
//从上到下; SubShader的标签、Pass的标签;SubShader是否和当前的GPU兼容
SubShader
{
//硬件将通过判定这些标签来决定什么时候调用该着色器
//可选可以啥都不写全部走默认值
Tags {
"Queue"="Transparent+10"
//Queue 渲染顺序,从小到大调用,可以用加减法微调,预定义的Queue有
//Background 1000 - 最早被调用的渲染,用来渲染天空盒或者背景
//Geometry 2000 - 这是默认值,用来渲染非透明物体(普通情况下,场景中的绝大多数物体应该是非透明的)
//AlphaTest 2450 - 用来渲染经过Alpha Test的像素,单独为AlphaTest设定一个Queue是出于对效率的考虑
//Transparent 3000 - 以从后往前的顺序渲染透明物体
//Overlay 4000 - 用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效) "RenderType"="Transparent"
//Unity可以运行时替换符合特定RenderType的所有Shader,与Camera.RenderWithShader或Camera.SetReplacementShader配合使用
//Unity内置的RenderType包括:
//Opaque: 不透明的物
//Transparent: 透明着色器
//Background: 天空盒都
//Overlay: GUI、镜头光晕等
//可以自定义替换标签 "Distort"="On" //其他常用
"IgnoreProjector"="True" //不接受Projector组件的投影
"ForceNoShadowCasting"="True" //不产生阴影
} //剔除规则 默认剔除背面
Cull Back | Front | Off //是否写入深度缓存 默认写入
ZWrite On | Off //深度检查 默认小于等于
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always //深度偏移 用来解决z-fighting现象 比如 Offset 3, 0
Offset Factor, Units //混合模式指令 也可以放在Pass中 详见Blending笔记
Blend SrcAlpha OneMinusSrcAlpha
//Blend Off 关闭混合,默认值
//Blend SrcFactor DstFactor 最终值=原值*SrcFactor + 屏幕值*DstFactor //Level of Detail, Quality Settings中设定 MaximumLOD level,从上到下选择第一个起效的SubShader
//代码用 Shader.globalMaximumLOD 控制
//一个SubShader一个LOD值 不支持Pass级的控制
LOD 200 //默认值为200 //支持多pass 多次绘制
Pass
{
//可选 模板缓冲 每个像素有一个8位(0-255)的模板值
//目标测试位于深度检测之前,额外的一个条件决定 片元shader是否调用
stencil
{
Ref referenceValue //参考值,这个值将用来与模板缓冲中的值进行比较
ReadMask readMask //读遮罩,读取是按位与(&)操作,默认值255
WriteMask writeMask //写遮罩,默认值255
Comp comparisonFunction //比较方式 默认 always
//参考值&readMask Comp 当前缓冲值&readMask
//[Greater, GEqual, Less, LEqual, Equal, NotEqual, Always, Never] Pass stencilOperation //通过模板测试和深度测试时的处理方式 默认值:keep
Fail stencilOperation //模板测试失败时 默认值:keep
ZFail stencilOperation //模板测试通过 深度测试失败 默认值:keep
//处理方式
//Keep 保留当前缓冲中的内容,即stencilBufferValue不变。
//Zero 将0写入缓冲,即stencilBufferValue值变为0。
//Replace 将参考值写入缓冲,即将referenceValue赋值给stencilBufferValue。
//IncrSat stencilBufferValue加1,如果stencilBufferValue超过255了,那么保留为255,即不大于255。
//DecrSat stencilBufferValue减1,如果stencilBufferValue超过为0,那么保留为0,即不小于0。
//Invert 将当前模板缓冲值(stencilBufferValue)按位取反
//IncrWrap 当前缓冲的值加1,如果缓冲值超过255了,那么变成0,(然后继续自增)
//DecrWrap 当前缓冲的值减1,如果缓冲值已经为0,那么变成255,(然后继续自减)
} //可选,用于Pass的重用
Name "PassName" //可选 Pass的Tags有和SubShader公用的也有专用的
Tags {
"LightMode"="ForwardBase"
//最重要的一个tag 指定用哪一种渲染路径,保证U3D的光照变量能被正确赋值
//ForwardBase 前向渲染,会计算环境光,最重要的平行光,逐顶点光源和Lightmaps
//ForwardAdd 前向渲染,会计算额外的逐像素光源,一个Pass对应一个光源
//Always 永远都渲染,但不处理光照
//Deferred 延迟渲染,会计算G-buffer
//ShadowCaster 把物体渲染到阴影映射纹理或一张深度纹理中
} //可以改变改pass的一些参数 不使用subshader的参数
//比如 Cull Zwrite Ztest 等 //标记CG代码开始
CGPROGRAM //#pragma 编译指令段 详见 https://docs.unity3d.com/Manual/SL-ShaderPrograms.html //指明顶点Shader和片元shader的函数名字
#pragma vertex vert
#pragma fragment frag //编译目标model版本
#pragma target name
//2.5(默认) 数字越高,要求越高 //多版本Shader 会生成多个版本的Shader 详见multiple shader笔记
#pragma multi_compile ...
//or
#pragma shader_feature ... //指定渲染平台
#pragma only_renderers gles gles3
#pragma exclude_renderers d3d9 d3d11 opengl
//常见手游平台
//gles - OpenGL ES 2.0
//gles3 - OpenGL ES 3.x
//metal - iOS/Mac Metal //cginc包,支持自定义,但是要写明路径,默认路径为Shader所在目录
#include "UnityCG.cginc"
#include "../Lib/MyTools.cginc" //数据类型声明
//基础精确
//float:32位高精度浮点数。
//half: 16位中精度浮点数。范围是[-6万, +6万],能精确到十进制的小数点后 3.3 位。
//fixed:11位低精度浮点数。范围是[-2, 2],精度是 1/256 ≈ 0.004
//都何以组合为向量或是矩阵比如 half3 fixed4 float4x4 等
//颜色和单位向量,使用fixed 其他情况,尽量使用half;否则才使用float。 //材质类型需要一条额外参数配置
sampler2D _XXXX;
float4 _XXXX_ST; //uniform 在UnityShader中可以省略
uniform fixed3 XX;
fixed XXX; //程序传给定点着色器的数据
struct a2v
{
//类型 名字 : 绑定的语义(从哪里读取数据,把数据输出到哪里)
//常见语义如下
float4 vertex : POSITION; //顶点的位置
float4 normal : NORMAL; //顶点的法线方向
float4 tangent : TANGENT; //顶点的切线方向
fixed4 color : COLOR; //顶点的颜色
float2 uvn : TEXCOORDn; //n从0开始,第n+1套纹理坐标
}; //定点着色器给片元着色器的数据
//经由顶点着色器的输出进行插值运算得出
struct v2f
{
float4 vertex : SV_POSITION; //必须有,有固定含义,表名裁剪空间的定点坐标
float4 custom : TEXCOORDn; //n:0~7 无固定含义 用来做一些自定义数据的传递
}; v2f vert (a2v v)
{
v2f o;
... ...
return o;
} //SV_Target 即 SystemValue_RenderTarget
fixed4 frag (v2f i) : SV_Target
{
... ...
//最终的结果是一个颜色 带一个alpha值
return fixed4(baseCol, alpha);
}
ENDCG
}
} //可选 备用shader
FallBack "Diffuse"
//当本Shader的所有SubShader都不支持当前显卡,就会使用FallBack语句指定的另一个Shader。
//FallBack最好指定Unity自己预制的Shader实现,因其一般能够在当前所有显卡运行。
// FallBack Off //将关闭FallBack //可选 自定义编辑器
CustomEditor "CustomShaderGUI类名"
}

ShaderLab中vertex fragment类Shader基础格式笔记的更多相关文章

  1. Es6对象的扩展和Class类的基础知识笔记

    /*---------------------对象的扩展---------------------*/ //属性简写 ,属性名为变量名, 属性值为变量的值 export default functio ...

  2. Python中的元类(metaclass)

    推荐+收藏:深刻理解Python中的元类(metaclass) 做一些笔记学习学习: 在大多数编程语言中,类就是用来描述如何生成一个对象的代码段,在Python中类也是一个对象,这个(类)对象自身拥有 ...

  3. Unity Shaders Vertex & Fragment Shader入门

    http://blog.csdn.net/candycat1992/article/details/40212735 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Sha ...

  4. 【Unity Shaders】Vertex & Fragment Shader入门

    写在前面 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Shader中实现描边效果的弊端,也就是只对表面平缓的模型有效.这是因为我们是依赖法线和视角的点乘结果来进行描边判 ...

  5. Java ClassLoader基础及加载不同依赖 Jar 中的公共类

    转载自:最新内容及最清晰格式请见 http://www.trinea.cn/android/java-loader-common-class/ 本文主要介绍 ClassLoader 的基础知识,Cla ...

  6. 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

    ---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ...

  7. Java基础(43):Java中的Object类与其方法(转)

    Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...

  8. 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法

    实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...

  9. 5.翻译:EF基础系列---EF中的上下文类

    原文地址:http://www.entityframeworktutorial.net/basics/context-class-in-entity-framework.aspx EF中的上下文类是一 ...

随机推荐

  1. swift中tableview的使用和注意事项

    今天使用swift写了个简单的tableView,语法和用法上跟oc没多大的区别.但是还是有一些细节的地方需要注意一下的. 先上代码 import UIKit class ViewController ...

  2. 洛谷——P3275 [SCOI2011]糖果

    P3275 [SCOI2011]糖果 差分约束模板题,基本思路就是$d[v]+w[v,u]<=d[u]$,$Spfa$更新方法, 有点套路的是要建立原点,即图中不存在的点来向每个点加边,但同样这 ...

  3. UVA - 10048 Audiophobia(Floyd求路径上最大值的最小)

    题目&分析: 思路: Floyd变形(见上述紫书分析),根据题目要求对应的改变判断条件来解题. 代码: #include <bits/stdc++.h> #define inf 0 ...

  4. Crossword Answers UVA - 232

    题目大意 感觉挺水的一道题.找出左面右面不存在或者是黑色的格子的白各,然后编号输出一横向单词和竖向单词(具体看原题) 解析 ①找出各个格子的编号 ②对每个节点搜索一下 ③输出的时候注意最后一个数据后面 ...

  5. python爬虫29 | 使用scrapy爬取糗事百科的例子,告诉你它有多厉害!

    是时候给你说说 爬虫框架了 使用框架来爬取数据 会节省我们更多时间 很快就能抓取到我们想要抓取的内容 框架集合了许多操作 比如请求,数据解析,存储等等 都可以由框架完成 有些小伙伴就要问了 你他妈的 ...

  6. 【03】json使用

    [03]json使用   把 JSON 文本转换为 JavaScript 对象 JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 J ...

  7. FZU 2105 (线段树)

     Problem 2105 Digits Count  Problem Description Given N integers A={A[0],A[1],...,A[N-1]}. Here we h ...

  8. php获取代理服务器真实内网IP方法

     功能:获取用户真实IP地址,代理服务器内网IP,防HTTP_CDN_FORWARDED_FOR注入 function getIP() { if (isset($_SERVER["HTTP_ ...

  9. [bzoj3668][Noi2014]起床困难综合症_暴力

    起床困难综合征 bzoj-3668 Noi-2014 题目大意:题目链接. 注释:略. 想法:Noi考这题...联赛T1难度.... 我们将每个门上的数二进制拆分. 发现:当前位的操作可能直接确定了当 ...

  10. Asp.Net页面生命周期[转]

    一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面,  完全识别 HTTP 页 ...