LOD:

设置:单个设置Shader.maximumLOD、全局设置Shader.globalMaximumLOD、QualitySettings里面的Maximum LODLevel
原理:小于指定值的shader和subshader才能被使用。
应用:有时候一些显卡虽然支持很多特性,但是效率很低,此时就可以用LOD来进行控制。
内置shader的LOD值:
  VertexLit kind of shaders = 100
  Decal, Reflective VertexLit = 150
  Diffuse = 200
  Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
  Bumped, Specular = 300
  Bumped Specular = 400
  Parallax = 500
  Parallax Specular = 600

注释:Shader自身的LOD会覆盖全局的LOD。

    public Shader targetShader;

    private void Start ()
{
// 全局的值会被Shader本地址覆盖
Shader.globalMaximumLOD = ;
if (targetShader != null)
{
targetShader.maximumLOD = ;
}
}

RenderQueue:

    mtrl.renderQueue = ;

  shader中使用ZTest Always,可以让被遮住的物体也渲染。

AlphaTest:

  固定管线:使用AlphaTest命令

  动态管线:使用clip(alpha - cutoff)指令来实现

  Alpha检测在ps完成计后,即将写入帧之前,通过和一个固定的数值比较,来决定当前ps的计算结果到底要不要写入帧中。

// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" } // inside CGPROGRAM in the fragment Shader:
clip(textureColor.a - alphaCutoffValue);

  AlphaTest抗锯齿:

// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" } // inside Pass
AlphaToMask On

AlphaBlend:

  shader渲染的最后一步,决定怎样将当前计算结果写入到帧缓存中。

  命令集:

  Blend BlendOp AlplaToMask

// inside SubShader
Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" } // inside Pass
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha

  AlphaBlend会有一系列和绘制顺序相关的问题,涉及到的知识点如下:

  (1)Unity通过Queue保证所有的不透明物体Geometry都会在半透明物体Transparent之前被渲染,(Queue标签决定了这个对象的渲染队列);

  (2)Unity保证所有Transparent队列的物体,按distance(物体的远近,不是像素的)从后往前渲染;

  (3)distance的计算方式:使用网格的几何中心点来进行半透明物体的排序。

  对于部分遮挡的物体,还是会产生不正确的遮挡效果。因此我们要么分割网格,要么使用Alpha Test或者开启ZWrite来替代。

AlphaTest和AlphaBlend的性能比较:

  官方文档在这里:https://docs.unity3d.com/Manual/SL-ShaderPerformance.html

  翻译如下:

  固定管线的AlphaTest和可编程管线的clip()函数,在不同平台有不同性能表现:

  (1)多数平台上,AlphaTest这种整个剔除透明像素的做法能获得一点点性能优势;

  (2)在ios和android这样基于PowerVR GUPs的设备上,AlphaTest是非常耗资源的,不要企图使用它来做性能优化,因为它会让游戏更慢(是因为直接丢掉像素,让GPUs的某些优化策略没法执行了)。

  所以结论是:手机上尽量使用AlphaBlend而不是AlphaTest。

ColorMask:

  ColorMask RGB | A | 0 | any combination of R, G, B, A

  ColorMask也是耗费比较大的操作,只在确实需要时使用。

ZWrite/ZTest:

  ZWrite On | Off

  ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

  关于相机的深度贴图_CameraDepthTexture:

  (1)默认材质都自带RenderType的Tag;

  (2)自定义sahder只有添加RenderType标签才会将深度写到_CameraDepthTexture。

Offset:

  对Z深度的偏移。

  可以让像素看起来更靠前或更靠后,当两个面重叠时,可以手动指定谁相对靠前一些,而且不会战胜z-fitting。

  Offset只会对ZTest的条件做修正,但是并不会改变最后的Z缓冲。

GrabPass:

  抓取当前屏幕当做贴图使用。

Shader "James/VP Shader/GrabPass"
{
Properties
{
_MainTex("MainTex", 2D) = "white" {}
}
SubShader
{
// 在所有不透明几何体之后自画,这一点很重要
Tags { "Queue" = "Transparent" }
GrabPass { "_MyGrab" }
Pass
{
CGPROGRAM
#pragma vertex vs
#pragma fragment ps
#include "UnityCG.cginc" struct v2f
{
float4 pos : SV_POSITION;
float3 color : COLOR0;
float2 uv : TEXCOORD0;
}; sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _MyGrab; v2f vs(appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
} float4 ps(v2f i):COLOR
{
float4 texColor = tex2D(_MainTex, i.uv);
float4 grabColor = tex2D(_MyGrab, i.uv);
return texColor * grabColor;
}
ENDCG
}
}
FallBack "Diffuse"
}

Fog:

  雾效实现的三种方式:

  (1)全局雾

  RenderSettings.fog = true;
RenderSettings.fogColor = Color.red;
RenderSettings.fogMode = FogMode.Linear;
RenderSettings.fogStartDistance = ;
RenderSettings.fogEndDistance = ;

  (2)Fog指令

  Fog{ Mode Linear Color(, , ) Range ,  }

  (3)Shader计算方式

Shader "James/VP Shader/Fog"
{
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_FogColor("FogColor", Color) = (, , , )
_Density("Density", Range(, )) =
_NearDistance("NearDistance", Float) =
_FarDistance("FarDistance", Float) =
}
SubShader {
Tags { "RenderType"="Opaque" }
Fog { Mode Off }
Pass
{
CGPROGRAM
#pragma vertex vs
#pragma fragment ps
#include "UnityCG.cginc" struct v2f
{
float4 pos : SV_POSITION;
float3 color : COLOR0;
float2 uv : TEXCOORD0;
float4 depth : TEXCOORD1;
}; sampler2D _MainTex;
float4 _MainTex_ST;
float4 _FogColor;
float _Density;
float _NearDistance;
float _FarDistance; v2f vs(appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.depth = mul(UNITY_MATRIX_MV, v.vertex);
o.depth.z = -o.depth.z;
o.depth.w = (_FarDistance - _NearDistance) * o.depth.w;
return o;
} float4 ps(v2f i):COLOR
{
float4 texColor = tex2D(_MainTex, i.uv);
float fg = ;
if(i.depth.z > _NearDistance && i.depth.z < _FarDistance)
{
fg = i.depth.z / i.depth.w;
}
else if(i.depth.z > _FarDistance)
{
fg = _FarDistance / i.depth.w;
}
return fg * _Density * _FogColor * texColor;
}
ENDCG
}
}
FallBack "Diffuse"
}

Stencil:

  Stencil-Test在Z-Test和Alpha-Test之前,如果模板检测不通过,则像素直接被丢掉而不会执行fragment函数。

Shader "James/VP Shader/Stencil"
{
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_refVal("Stencil Ref Value",int)=
}
SubShader {
Tags { "RenderType"="Opaque" }
ZTest Always
Stencil
{
Ref [_refVal]
Comp GEqual
Pass Replace
Fail keep
ZFail keep
}
Pass
{
CGPROGRAM
#pragma vertex vs
#pragma fragment ps
#include "UnityCG.cginc" struct v2f
{
float4 pos : SV_POSITION;
float3 color : COLOR0;
float2 uv : TEXCOORD0;
}; sampler2D _MainTex;
float4 _MainTex_ST; v2f vs(appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
} float4 ps(v2f i):COLOR
{
float4 texColor = tex2D(_MainTex, i.uv);
return texColor;
}
ENDCG
}
}
FallBack "Diffuse"
}

Pass的通用指令开关的更多相关文章

  1. 关于Unity中混合模式、Alpha测试、深度测试、通道遮罩、面剔除的使用----渲染通道通用指令(二)

    混合模式 着色完成后,需要把颜色混合到帧缓冲区里面,涉及到源和目标. 1:在所有计算完成后,决定当前的计算结果输出到帧缓冲区时,如何混合源和目标,通常用来绘制半透明的物体;2: Blend Off 关 ...

  2. U3D shaderlab 相关指令开关

    Subshader { [Tags] [CommonState] Passdef [Passdef ...] }Tags分为SubShader Tags和Pass Tags,Tags放在SubShad ...

  3. Groovy脚本-通用SQL开关

    备注:使用Groovy语言进行编写,看不懂的同学请先了解Groovy脚本. Groovy学习地址:https://www.cnblogs.com/tiechui2015/p/10828457.html ...

  4. 关于Unity中LOD和渲染队列----渲染通道通用指令(一)

    每个shader里面有很多的subshader,如果所以的subshader都不执行的话就,就执行fallback.每个subshader都可以设置一个LOD,整个shader也有一个LOD. 系统就 ...

  5. AIX 第3章 指令记录

    [ssdb01.shz.hn|oracle|/home/oracle]$oslevel -rq  --查看系统已安装的维护级别 Known Recommended Maintenance Levels ...

  6. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

    说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...

  7. Delphi中PointerMath指令

    Type   Switch   Syntax   {$POINTERMATH ON} or {$POINTERMATH OFF}   Default   {$POINTERMATH OFF}   Sc ...

  8. Redis指令与数据结构(二)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  9. 深入理解java虚拟机(六)字节码指令简介

    Java虚拟机指令是由(占用一个字节长度.代表某种特定操作含义的数字)操作码Opcode,以及跟随在其后的零至多个代表此操作所需参数的称为操作数 Operands 构成的.由于Java虚拟机是面向操作 ...

随机推荐

  1. logstash匹配多行日志

    在工作中,遇到一个问题就是日志的处理,首选的方案就是ELFK(filebeat+logstash+es+kibana) 因为之前使用过logstash采集日志的时候,非常的消耗系统的资源,所以这里我选 ...

  2. 如何使用 Chrome 浏览器调试动态加载的 Javascript 脚本

    在IE中,可以在调试程序的文档列表最下方看到一个"动态脚本"的文件夹,里面可以找到动态加载的脚本,但是...数量繁多,也不能自定义名称... 但是在 Chrome 中,貌似根本找不 ...

  3. ios总结2018

      1.为什么说Objective-C是一门动态的语言? 1.object-c类的类型和数据变量的类型都是在运行是确定的,而不是在编译时确定.例如:多态特性,我们可以使用父类指针来指向子类对象,并且可 ...

  4. pyqt5开发环境安装

    1.下载所需软件. Anaconda下载地址:https://repo.continuum.io/archive/ PyQt5下载地址:https://sourceforge.net/projects ...

  5. Spring、SpringMVC和Springboot的区别(网摘)

    spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc. spring mvc 是只是spring 处理web层请求的一个模 ...

  6. C++中的友元函数和友元类

    C++中的友元函数主要应用于以下场景: 友元函数 第一种场景 代码中有一个全局函数,该函数想要去访问某个类的成员变量(该类的成员变量是private的,且该类并未提供任何获取获取私有成员变量的publ ...

  7. Lua官方文档与源码分析

    https://www.lua.org/source/5.3/ http://www.cppblog.com/airtrack/archive/2012/09/19/191233.html https ...

  8. c# 除掉前三个字符,剩下的4个字符全为数字方为特殊车辆

    string plate="粤BN1223"; if (plate.Contains("粤BN")) { //除掉前三个字符,剩下的4个字符全为数字方为特殊车辆 ...

  9. (原创)拨开迷雾见月明-剖析asio中的proactor模式(一)

    使用asio之前要先对它的设计思想有所了解,了解设计思想将有助于我们理解和应用asio.asio是基于proactor模式的,asio的proactor模式隐藏于大量的细节当中,要找到它的踪迹,往往有 ...

  10. linux 命令(43):bash 快捷键操作

    ctrl 命令行快捷键: CTRL+A: – 快速移动到行首. 我们假设你输入了像下面这样的命令.当你在第 N 行时,你发现在行首字符有一个输入错误 $ gind . -mtime -1 -type ...