Shader编程思路来源浅墨大牛,思维记录用。(本章节主要介绍语法内容,第二天开始实战)
Shader在unity中也叫ShaderLab,可以看作cg语言(Cforgraphics,即用于图形的C语言)的打包。
Shader作用在material上,使用到物体上。Shader本质是程序,负责将输入的mesh与颜色、贴图进行组合输出,绘图单元根据Shader定义完成图像绘制。Material就是颜色、贴图、shader的集合。
Shader分为固定功能着色器、表面着色器、顶点&片段着色器。
固定着色器:利用unity自己的关键字、规范完成Shader编程。
表面着色器:Unity原创书写方式,本质为定点&片段着色器的一个子集。代码段中有surf函数的
顶点着色器:嵌套了CG语言,产生纹理坐标,颜色,点大小,雾坐标,然后把它们传递给裁剪阶段。
片段着色器:嵌套了CG语言,进行纹理查找,决定什么时候执行纹理查找,是否进行纹理查找,及把什么作为纹理坐标
固定着色器
样式
Shader “Sony的Shder/0_FirstShader“
{
Properities{}
SubShader
{
Tags {"TagName1" ="Value1" "TagName2" ="Value2" }
Pass{}
}
Fallback“Diffuse”
}
Properity内语法(pass中属性调用方法为【name】)
name ("display name", Range (min, max)) =number
定义浮点数属性,在检视器中可通过一个标注最大最小值的滑条来修改。
name ("display name", Color) =(number,number,number,number)
定义颜色属性
name ("display name", Float) = number
定义浮点数属性
name ("display name", Vector) =(number,number,number,number)
定义一个四元素的容器(相当于Vector4)属性
name ("display name", 2D) = "" {options }
定义2D纹理属性
name ("display name", Rect) = ""{ options }
定义长方形(非2次方)纹理属性
name ("display name", Cube) = ""{ options }
定义立方贴图纹理属性
属性可以在视图窗口修改,在SubShader中调用。
Tag标签用于多个shader的渲染顺序与效果{
分为队列标签,忽略投影标签, 光照模式标签, 条件选项标签
队列标签Tags {"Queue" ="Geometry" }
Background:这个渲染队列在所有队列之前被渲染,被用于渲染天空盒之类的对象。
Geometry:默认值,这个队列被用于大多数对象。 不透明的几何体使用这个队列。
Transparent :这个渲染队列在几何体队列后被渲染,如玻璃,粒子效果等应该在这里渲染
Overlay:这个渲染队列被用于实现叠加效果。任何需要最后渲染的对象应该放置在此处。(如镜头光晕等)
自定义中间队列Tags {"Queue" ="Geometry+1" }
忽略投影标签Tags {" IgnoreProjector" ="true” }
若设置IgnoreProjector(忽略投影)标签为"True",那么使用这个着色器的对象就不会被投影机制(Projectors)所影响。对半透明的物体来说因为暂时没有对他们产生投影的比较合适的办法,那么直接忽略掉就行了。
光照模式标签Tags {"LightingMode" ="Always" }
Always: 总是渲染。没有运用光照。
ForwardBase:用于正向渲染,环境光、方向光和顶点光等
ForwardAdd:用于正向渲染,用于设定附加的像素光,每个光照对应一个pass
PrepassBase:用于延迟光照,渲染法线/镜面光。
PrepassFinal:用于延迟光照,通过结合纹理,光照和自发光渲染最终颜色
Vertex: 用于顶点光照渲染,当物体没有光照映射时,应用所有的顶点光照
VertexLMRGBM:用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是RGBM 编码
VertexLM:用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是double-LDR 编码(移动平台,及老式台式CPU)
ShadowCaster: 使物体投射阴影。
ShadowCollector: 为正向渲染对象的路径,将对象的阴影收集到屏幕空间缓冲区中。
条件选项标签Tags { " RequireOptions" =" SoftVegetation"}
若想要在一些外部条件得到满足时某pass才渲染,就可以通过使用RequireOptions标签,它的值是一个空格分割的字符串,目前由Unity3d支持的选项只有一个,就是渲染植被之时:
SoftVegetation: 如果在QualitySettings中开启渲染软植被(Edit->Project Settings->Quality),则该pass可以渲染
}
Pass中的代码
Color Color
设定对象的纯色。颜色即可以是括号中的四值(RGBA),也可以是被方框包围的颜色属性名。
Material {Material Block }
材质块被用于定义对象的材质属性。
材质和光线的设置,默认为黑色,大多情况需要自己设置
MaterialBlock {
Diffuse Color(R,G,B,A)
漫反射颜色构成。这是对象的基本颜色。
Ambient Color(R,G,B,A)
环境色颜色构成.这是当对象被RenderSettings.中设定的环境色所照射时对象所表现的颜色。
Specular Color(R,G,B,A)
对象反射高光的颜色。(R,G,B,A)四个分量分别代表红绿蓝和Alpha,取值为0到1之间。
Shininess Number
加亮时的光泽度,在0和1之间。0的时候你会发现更大的高亮也看起来像漫反射光照,1的时候你会获得一个细微的亮斑。
Emission Color
自发光颜色,也就是当不被任何光照所照到时,对象的颜色。(R,G,B,A)四个分量分别代表红绿蓝和Alpha,取值为0到1之间。
}
AlphaTest (Less| Greater | LEqual | GEqual| Equal | NotEqual | Always) CutoffValue
开启alpha测试
Blend SourceBlendMode|DestBlendMode
设置alpha混合模式
ColorMask RGB| A | 0| any combination of R, G, B, A
设置颜色写遮罩。设置为0将关闭所有颜色通道的渲染
Offset OffsetFactor, OffsetUnits
设置深度偏移
ColorMaterial AmbientAndDiffuse| Emission
当计算顶点光照时使用每顶点的颜色
Lighting On | Off
开启光照,也就是定义材质块中的设定是否有效。想要有效的话必须使用Lighting On命令开启光照,而颜色则通过Color命令直接给出。
SeparateSpecular On | Off
开启独立镜面反射。这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。
ColorMaterial AmbientAndDiffuse | Emission
使用每顶点的颜色替代材质中的颜色集。AmbientAndDiffuse 替代材质的阴影光和漫反射值;Emission 替代 材质中的光发射值。
Cull Back| Front| Off
设置多边形剔除模式
ZTest (Less |Greater | LEqual | GEqual |Equal | NotEqual | Always)
设置深度测试模式
ZWrite On | Off
设置深度写模式
Fog {Fog Block }
设置雾参数
SetTexture [texture property]{ [Combineoptions] }
纹理设置,用于配置固定函数多纹理管线,当自定义fragmentshaders 被使用时,这个设置也就被忽略掉了。
UsePass "Specular/BASE"
通道中Name "MyPassName"用来调用别的Shader通道
GrabPass捕获屏幕内容到纹理中
GrabPass 可以捕获物体所在位置的屏幕的内容并写入到一个纹理中,通常在靠后的通道中使用,这个纹理能被用于后续的通道中完成一些高级图像特效。
SetTexture [TexturePropertyName] { TextureBlock }
TextureBlock纹理合并
combine src1 * src2
将源1和源2的元素相乘。结果会比单独输出任何一个都要暗
combine src1 + src2
将将源1和源2的元素相加。结果会比单独输出任何一个都要亮
combine src1 - src2
源1 减去 源2
combine src1 +- src2
先相加,然后减去0.5(也就是添加了一个符号)
combine src1 lerp (src2) src3
使用源2的透明度通道值在源3和源1中进行差值,注意差值是反向的:当透明度值是1使用源1,透明度为0时使用源3
combine src1 * src2 + src3
源1和源2的透明度相乘,然后加上源3
combine src1 * src2 +- src3
源1和源2的透明度相乘,然后和源3做符号加
combine src1 * src2 - src3
源1和源2的透明度相乘,然后和源3相减
其中,所有src属性都可以是previous,constant, primary or texture其中的一个。
Previous 是上一次SetTexture的结果
Primary 是来自光照计算的颜色或是当它绑定时的顶点颜色
Texture是在SetTexture中被定义的纹理的颜色
Constant是被ConstantColor定义的颜色(constantColor (1,1,1,1))