介绍
固定渲染管线shader(fixed function shader),是相对于可编程的shader而言的。
所谓固定管线,是说芯片上一组电路已经固定实现了特定的运算功能,程序能做的只是提供场景数据以及微调运算功能的参数。
它适用于所有的显卡,常用于高级Shader在老显卡无法显示时的Fallback。
Unity中的固定管线shader使用ShaderLab语言。
它的灯光公式、贴图方式等是固定的,不能自定义的修改,我们只能控制功能的开和关
Material
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Shader "Custom/fixed function1" { Properties { _Color("Main Color", color) = (1,1,1,1) _Ambient("Ambient", color) = (0.5,0.5,0.5,1) _Specular("Specular", color) = (1,1,1,1) _Shininess("Shininess", range(0,8)) = 4 _Emission("Emission", color) = (1,1,1,1) } SubShader{ Pass{ //漫反射需要打开光照 Lighting On //开启镜面反射(默认的是漫反射,需要镜面反射的时候需要打开镜面反射) SeparateSpecular On Material { Diffuse(1,0,0,1)//固定漫反射 Diffuse[_Color]//可调漫反射 //当漫反射调成白色,就可以看出环境光的效果 Ambient[_Ambient]//可调环境光颜色 Emission[_Emission]//自发光颜色,强度比较高 //下面是镜面反射 //高光颜色 Specular[_Specular] //光泽度(range)调整光泽度的时候一般都先关闭自发光(自发光的强度高,影响效果) Shininess[_Shininess] } } } } |
TextureSetup
- Combine:将两种颜色进行混合,可以是上次SetTexture的处理结果,(previous、constant、primary、Texture中的一种)
Previous is the the result of the previous SetTexture.
上一次SetTexture的结果Primary is the color from the lighting calculation or the vertex color if it is bound.
来自光照计算的颜色或是当它绑定时的顶点颜色Texture is the color of the texture specified by [_TextureName] in the SetTexture (see above).
在SetTexture中被定义的纹理的颜色Constant is the color specified in ConstantColor.
被ConstantColor定义的颜色
- constantColor:设置一个常量的颜色值
- matriax:设置矩阵纹理坐标进行变换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
Shader "Custom/Texture" { Properties { _MainTex("纹理图片",2D)=""{} _SeconTex("第二个纹理",2D)=""{} _MainCol("漫反射颜色",Color)=(1,0,0,1) _LerpValue("插值比例",Range(0,1))=0 } SubShader { Pass { Lighting On Material { Diffuse[_MainCol] } //设置纹理 //SetTexture[_MainTex] //{ // // 融合纹理和其他 // // Combine:融合命令 // // Primary 是来⾃光照计算的颜⾊或是当它绑定时的顶点颜⾊ // Combine texture * Primary //} SetTexture[_MainTex] { // 纹理的颜色与上面的固定颜色做混合 ConstantColor[_MainCol] // combine src1 * src2 更暗 // combine src1 + src2 更亮 // combine src1 - src2 Combine texture * Constant Quad // Texture是在SetTexture中被定义的纹理的颜⾊ // Constant是被ConstantColor定义的颜⾊ // 双倍/四倍 Double / Quad } SetTexture[_SecondTex] { ConstantColor(0,0,0,[_LerpValue]) // 使⽤源2的透明度通道值在源3和源1中进⾏插值,注意插值是反向的:当透明度值是1是使⽤源1,透明度为0时使⽤源3 Combine Previous lerp(Constant) texture // Previous 是上⼀次SetTexture的结果 } } } Fallback "Diffuse" } |
多边形剔除
一般都是通过多通道进行剔除,剔除后的效果是正面和反面的颜色不同
1 2 3 4 5 6 7 8 9 10 |
Pass{ //剔除正面 Cull Front } Pass{ //剔除反面 Cull Back } //不剔除 //Cull Off |
深度
深度就是根据顶点和像素距离摄像机的距离
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Shader "Custom/Three" { Properties { _Mask("遮挡时的颜色",Color)=(0,1,0,1) _Noocclusion("没被遮挡时的颜色",Color)=(1,0,1,1) } SubShader { Pass { //ZTest (Less | Greater | LEqual | GEqual |Equal | NotEqual | Always) 分别表示 小于 | 大于 | 小于等于 | 大于等于 | 等于 | 不等于 | 总是 ZTest Greater //关闭深度缓存,只渲染我自己 ZWrite Off //设置颜色 Color[_Mask] } Pass { ZTest LEqual //设置颜色 Color[_Noocclusion] } } Fallback "Diffuse" } |
混合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Shader "Custom/Four" { Properties { _Color("Color",Color)=(1,0,0,1) } SubShader { Pass { // 开启透明混合 Blend SrcAlpha OneMinusSrcAlpha // 相加 Blend One One // ⽐较柔和的相加 Blend One OneMinusDstColor // 乘法 Blend DstColor Zero // 2倍乘法 Blend DstColor SrcColor // 开启顶点光照 Lighting On Material { Diffuse[_Color] } } } Fallback "Diffuse" } |
渲染队列(Render Queue)
既渲染的先后顺序
一般的,距离摄像机越远的物体越先渲染,越近的物体最后渲染。但有时候需要一个物体在任何情况下都最后去渲染,不想任何物体挡住,这时候就需要在Shader里面手动的设置渲染队列
在使用渲染队列的时候,需要关闭深度测试(深度测试和深度缓存(ZWrite On/Off)默认都是开启的)
1 2 3 4 5 6 |
Background(1000) 最早被渲染的物体的队列。 Geometry (2000) 不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染,也是Unity Shader中默认的渲染队列。 AlphaTest (2450) 有透明通道,需要进行Alpha Test的物体的队列,比在Geomerty中更有效。 Transparent(3000) 半透物体的渲染队列。一般是不写深度的物体,Alpha Blend等的在该队列渲染。 Overlay (4000) 最后被渲染的物体的队列,一般是覆盖效果,比如镜头光晕,屏幕贴片之类的。 |
1 2 3 4 5 6 |
SubShader{ //设置渲染队列 Tags{"Queue"="BackGround+500"} //关闭深度测试 ZText Off } |
- 本文固定链接: http://www.u3d8.com/?p=2431
- 转载请注明: 网虫虫 在 u3d8.com 发表过