shader基本知识汇总,关键字详解Tag,Lab,Properties,_Time,渲染顺序

Tag
Tags { “Queue”=“Geometry+10” “RenderType”=“Opaque” }
“Queue"标签。定义渲染顺序:
“Background”。值为1000。比如用于天空盒。
“Geometry”。值为2000。大部分物体在这个队列。不透明的物体也在这里。这个队列内部的物体的渲染顺序会有进一步的优化(应该是从近到远,early-z test可以剔除不需经过FS处理的片元)。其他队列的物体都是按空间位置的从远到近进行渲染。
“AlphaTest”。值为2450。已进行AlphaTest的物体在这个队列。
“Transparent”。值为3000。透明物体。
“Overlay”。值为4000。比如镜头光晕。
用户可以定义任意值,比如"Queue”=“Geometry+10”
"RenderType"标签。Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。Unity内置的RenderType包括:
“Opaque”:绝大部分不透明的物体都使用这个;
“Transparent”:绝大部分透明的物体、包括粒子特效都使用这个;
“Background”:天空盒都使用这个;
“Overlay”:GUI、镜头光晕都使用这个;
还有其他可参考Rendering with Replaced Shaders;用户也可以定义任意自己的RenderType字符串。
“ForceNoShadowCasting”,值为"true"时,表示不接受阴影。
“IgnoreProjector”,值为"true"时,表示不接受Projector组件的投影。

Lab
1、Material { Material Block }:定义一个使用顶点光照管线的材质。
2、Lighting On | Off:开启或关闭顶点光照。
3、Cull Back | Front | Off: 设置多边形剔除模式。
4、ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always):设置深度测试模式。
5、ZWrite On | Off:设置深度写模式。
6、Fog { Fog Block }:设置雾参数。
7、AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue:开启 alpha 测试。
8、Blend SourceBlendMode DestBlendMode:设置 alpha 混合模式。
9、Color Color value:设置当顶点光照关闭时所使用的颜色。
10、ColorMask RGB | A | 0 | any combination of R, G, B, A:设置颜色写遮罩。设置为0将关闭所有颜色通道的渲染。
11、Offset OffsetFactor , OffsetUnits:设置深度偏移。
12、SeparateSpecular On | Off:开启或关闭顶点光照相关的平行高光颜色.
13、ColorMaterial AmbientAndDiffuse | Emission:当计算顶点光照时使用每顶点颜色
Texture Setup 纹理设置:在完成渲染设定后,你能指定一定数量的纹理和当使用 SetTexture 命令时所采用的混合模式
1、SetTexture texture property { [Combine options] }:纹理设置 配置了 固定函数多纹理管线,当自定义fragment shaders 被使用时,将忽略这个设置。
2、Per-pixel Lighting:每像素光照。每像素光照管线通过多次通道渲染对象来完成。Unity渲染对象一次来获取阴影色和任何顶点光照。然后再在额外的并行通道中渲染出每像素光照的效果。
3、Per-vertex Lighting:每顶点光照。每顶点光照是标准的Direct3D/OpenGL光照模式,通过计算每个顶点的光照来完成。Lighting on命令开启光照。光照被材质块,颜色材质和平行高光命令所影响。

Properties
1、name (“display name”, Range (min, max)) = number:定义浮点数范围属性。
2、name (“display name”, Color) = (number,number,number,number):定义颜色属性。
3、name (“display name”, 2D) = “name” { options }:定义2D纹理属性。
4、name (“display name”, Rect) = “name” { options }:定义长方形(非2次方)纹理属性。
5、name (“display name”, Cube) = “name” { options }:定义立方贴图纹理属性。
6、name (“display name”, Float) = number:定义浮点数属性。
7、name (“display name”, Vector) = (number,number,number,number):定义一个四元素的容器(Vector4)属性。
_Time
1_Time是个4维向量,跟Unity3D中的deltaTime(这是个一维的,数值)不同。
2、float4 _Time : Time (t/20, t, t2, t3), use to animate things inside the shaders
3、那么默认x = Speed * _Time.x
4、常用fixed x= Speed * _Time.y;

//Shader “curtome/Basic” {
// Properties{ _Color(“Main Color”, Color) = (1, 0.5, 0.5, 1) }
// SubShader{
// Pass{
// Material{ Diffuse[_Color] }
// Lighting On
// }
// }
//}
Shader 包括所有代码,第一行的就是一个Shader的名称,斜杠表示目录结构
Properties
1.首先就是这个Properties(属性)块,它定义了一些设计师可以在Inspector(Unity中的属性编辑界面)中进行配置的属性。
2.在Properties代码中,每一个属性值占一行。每一行的写法:首先是内部名称(Internal name),然后是Inspector中显示的名称(Inspector title),然后是该属性的类型(Property type),最后是该属性的默认值(Default value)。如下所示:
name (“display name”, Range (min, max)) = number
name (“display name, Color) = (number, number, number, number)
name (“display name”, 2D) = “name” { options }
name (“display name”, Rect) = “name” { options }
name (“display name”, Float) = number
name (“display name”, Vector) = (number, number, number, number)
3所有属性的类型如下所示,而属性的默认值也因属性的不同而不同:
name (“display name”, Range (min, max)) = number
name (“display name”, Color) = (number, number, number, number)
name (“display name”, 2D) = “name” { options }
name (“display name”, Rect) = “name” { options }
name (“display name”, Float) = number
name (“display name”, Vector) = (number, number, number, number)
现在我们的属性定义就算是OK了,让我们再来看看如何编写真正的着色部分。

不同的显卡有不同的处理能力,比如有的显卡就支持Fragment Program(片段编程),而有的就不支持。那为了更好的利用显卡的处理性能,所以在一个大的Shader中就包含了很多“小”Shader,被称之为SubShaders。当Unity渲染着色时,它会遍历所有SubShader,找到第一个被显卡支持的SubShader然后执行。
Shader “Structure Example” {
Properties{ /* …shader properties… / }
SubShader{ /
…subshader that uses vertex/fragment programs… / }
SubShader { /
…subshader that uses four textures per pass… / }
SubShader { /
…subshader that uses two textures per pass… / }
SubShader { /
…subshader that might look ugly but runs on anything */ }
}

The Shader Body
每一个SubShader包含了很多通道,而通道又去渲染图形。因此,每个SubShader中必然包含至少一个Pass(通道)。比如刚才的VertexLit着色器代码所示:
// …snip…
Pass
{
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting On
SeparateSpecular On
SetTexture [_MainTex] {
constantColor [_Color]
Combine texture * primary DOUBLE, texture * constant
}
}
// …snip…
在Pass中定义的命令告诉显卡应该去如何渲染特定的图形。
上面代码中的Material代码块绑定了一些属性。而Lighting On则激活了标准顶点光源(Standard Vertex Lighting),SperateSpecular On则激活了不同颜色的反射高光。
所有这些命令其实都映射到了OpenGL/Direct3D的硬件模型(Hardware Model)。
而SetTexture命令则定义了如何对贴图进行处理,在这里使用了Combine对贴图进行处理,其语法为:
Combine ColorPart, AlphaPart
到现在我们已经基本实现了一个Shader,里面包含一个SubShader和其中的一个Pass。其实我们可以定义多个SubShader和多个Pass。但现在的这个Shader已经满足了我们的需要,因为写成这样即可。
_MainTex_ST是什么
(1)简单来说,TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的。 (v.texcoord就是顶点的uv)
下面这两个函数是等价的。
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
(2)而_MainTex_ST的ST是应该是SamplerTexture的意思 ,就是声明_MainTex是一张采样图,也就是会进行UV运算。 如果没有这句话,是不能进行TRANSFORM_TEX的运算的。_MainTex_ST.xy为 下图中的Tiling,zw为下图中的offset.
如果Tiling 和Offset你留的是默认值,即Tiling为(1,1) Offset为(0,0)的时候,可以不用
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
换成o.uv = v.texcoord.xy;也是能正常显示的;相当于Tiling 为(1,1)Offset为(0,0),但是如下图自己填的Tiling值和Offset值就不起作用了

深度测试、深度写入关系
深度测试失败, 则不写入深度缓冲区,不写入颜色缓冲区
深度测试通过, 深度写入开启, 写入深度缓冲区,写入颜色缓冲区
深度测试通过, 深度写入关闭, 不写入深度缓冲区,写入颜色缓冲区

默认 ZTest LEqual ZWrite On
渲染流程

  1. VertexShader(Transform,TexGen,Lighting)
  2. Culling, Depth Test (Early-Z, 也叫Z-cull)
  3. FragmentShader(Testuring Fog)
  4. AlphaTest
  5. Blending

渲染顺序: 先渲染不透明物体,从前到后(从距离摄像机近的到距离摄像机远的); 在渲染透明物体, 从后到前。
开启了AlphaTest就不会进行Early-Z, Z test 推迟到fragment之后

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值