//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. 四角递推(CF Working out,动态规划递推)

    题目:假如有A,B两个人,在一个m*n的矩阵,然后A在(1,1),B在(m,1),A要走到(m,n),B要走到(1,n),两人走的过程中可以捡起格子上的数字,而且两人速度不一样,可以同时到一个点(哪怕 ...

  2. centos 7桌面和命令行转行

    CentOS7图形界面与命令行界面(终端)切换(1)CentOS7 在图形界面进入dos界面 :ctrl+alt+F6 dos界面进入图形界面:ctrl+alt+F2 本机用的这个命令: (2)Cen ...

  3. Apache Maven Cookbook(一)maven 使用命令创建、编译java项目

    一.创建 使用命令创建项目分几步: 1.打开命令行窗口,比如cmd,把目录切换至想要创建项目地方. 2.执行如下命令: mvn archetype:generate -DgroupId=com.zua ...

  4. Maven学习总结(32)——Maven项目部署到Tomcat8中

    1.环境准备 Maven.Tomcat8.Eclipse 2.maven中的镜像配置 大家知道,mavne默认使用的是国外的镜像,但是速度很慢,这里建议大家使用阿里的中央仓库镜像. 阿里出品,必出精品 ...

  5. App后台开发运维和架构实践学习总结(5)——App产品从需求到研发到开发到上线到产品迭代全过程

    前言 如果没有做过开发,研发过产品的人,很难体会做产品的艰难,刚进公司的人,一般充当的是程序开发,我这里说的是开发,它与研发是有区别的. 一个需求下来,如果不能很好地理解产品需求,如果不能很好的驾驭需 ...

  6. iframe 与frameset

    frameset 元素可定义一个框架集.它被用来组织多个窗口(框架).每个框架存有独立的文档.在其最简单的应用中,frameset 元素仅仅会规定在框架集中存在多少列或多少行.您必须使用 cols 或 ...

  7. HDU 5291 Candy Distribution

    Candy Distribution Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  8. [luoguP2486] [SDOI2011]染色(树链剖分)

    传送门 就是个模板啦 记录每一个点的左端点颜色和右端点颜色和当前端点颜色段数. 合并时如果左孩子右端点和右孩子左端点不同就 ans-- 在重链上跳的时候别忘记统计一下 ——代码 #include &l ...

  9. [K/3Cloud]调用动态表单时,传递自定义参数

    插件中在调用动态表单时,通过DynamicFormShowParameter的CustomParams,增加自定义的参数. private void ShowMaterialStock() { obj ...

  10. Spring的Java配置方式

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1     @Configuration 和 @Bean Spring的Java配置方式是通过 @Configuration ...