(一)UsePass 命令 使用 来自另一个着色器的命名通道。

Syntax 语法

UsePass "Shader/Name"
插入所有来自给定着色器中的给定名字的通道。Shader/Name包含了通过斜杠字符分割的着色器的名字和通道的名字
某些着色器重用其他着色器中已存在的通道,减少重复的代码。例如,在许多像素光照着色器中,阴影色或顶点光照通道在在相应的顶点光照着色器中是相同的。UsePass命令只是包含了另一个着色器的给定通道。例如当如下的命令可以使用内置的高光着色器中的名叫"Base"的通道:
UsePass "Specular/BASE"
为了让UsePass能正常工作,必须给希望使用的通道命名。通道中的Name命令将提供这个名字:
Name "MyPassName"
注意,所有通道名字都是大写开头,因此UsePass必须使用大写开头的名字来书写索引 。

(二)GrabPass 是一种特殊的通道类型 - 捕获物体所在位置的屏幕的内容并写入到一个纹理中。这个纹理能被用于后续的通道中完成一些高级图像特效。

Syntax 语法

有两种方式将GrabPass放入一个 subshader 中:

  • GrabPass {} 能捕获当前屏幕的内容到一个纹理中。纹理能在后续通道中通过 _GrabTexture 进行访问。注意:这种形式的捕获通道将在每一个使用该通道的对象渲染过程中执行昂贵的屏幕捕获操作
  • GrabPass { "TextureName" } 能捕获屏幕内容到一个纹理中,但只会在每帧中处理第一个使用给定纹理名的纹理的对象的渲染过程中产生捕获操作。纹理在未来的通道中可以通过给定的纹理名访问。当你在一个场景中拥有多个使用GrabPass的对象时将提高性能。

此外,GrabPass能使用Name 和 Tags命令。

这里有一种反相已被渲染的像素的颜色的昂贵方式:

Shader "GrabPassInvert" {
SubShader {
// Draw ourselves after all opaque geometry
// 在所有不透明几何体之后自画
Tags { "Queue" = "Transparent" } // Grab the screen behind the object into _GrabTexture
// 捕获对象后的屏幕到_GrabTexture
GrabPass { } // Render the object with the texture generated above, and invert it's colors
// 用前面捕获的纹理渲染对象,并反相它的颜色
Pass {
SetTexture [_GrabTexture] { combine one-texture }
}
}
}

这个着色器有两个通道:第一个通道捕获在渲染时刻对象背后的所有图像,然后执行第二次通道。当然,在现在,实现同样的效果,使用反相 混合模式将更加廉价。


(三)Tags 子着色器使用标签来告诉渲染引擎期望何时和如何渲染对象。

Syntax 语法

Tags { "TagName1" = "Value1" "TagName2" = "Value2}
为标签 指定 值。能设定任意多标签
标签是标准的键值对。在其中有一个SubShader 标签被用于决定渲染的次序和子着色器中的其他标签。

Rendering Order - Queue tag
渲染次序 - 队列 标签

你能使用 Queue 标签决定对象被渲染的次序。着色器决定它所归属的对象的渲染队列,任何透明渲染器可以通过这个办法确认可以在所有不透明对象渲染后再进行渲染。

有四种预定义的渲染队列,在预定义队列之间还可以定义更多队列

    • Background
      后台 - 这个渲染队列在所有队列之前被渲染,被用于渲染天空盒之类的对象。
    • Geometry (default) - 
      几何体(缺省) - 这个队列被用于大多数对象。 不透明的几何体使用这个队列。
    • Transparent -
      透明 - 这个渲染队列在几何体队列之后被渲染,采用由后到前的次序。任何采用alpha混合的对象(不对深度缓冲产生写操作的着色器)应该在这里渲染(玻璃,粒子效果)
    • Overlay
      覆盖 - 这个渲染队列被用于实现叠加效果。任何需要最后渲染的对象应该放置在此处。(如镜头光晕)
Shader "Transparent Queue Example" {
SubShader {
Tags {"Queue" = "Transparent" }
Pass {
// rest of the shader body...
}
}
}

举例说明如何在透明队列中渲染对象。

几何体渲染队列为了达到最优的性能优化了对象的绘制次序。其他渲染队列依据举例排序对象,从最远的对象开始渲染到最近的对象。

对于特殊的需要可以使用中间队列来满足。在Unity实现中每一个队列都被一个整数的索引值所代表。后台为1000,几何体为2000,透明为3000,叠加层为4000. 着色器可以自定义一个队列

Tags { "Queue" = "Geometry+1" }

这会使对象在所有不透明的对象渲染之后但却在所有透明物体前被渲染,该渲染队列的索引值为2001.当你希望某些对象总是在其他某些对象前被绘制的情况下,这种能力对你有用。例如,在大多数时候,透明的水总是应该在所有不透明的物体之后并在透明对象前被渲染。

IgnoreProjector tag 忽略投影 标签

如果设置忽略投影标签为"True",那么使用这个着色器的对象将不会被投影机所影响。对半透明的物体来说最有用处,因为没有对他们产生投影的好办法。

Unity3d Shader开发(四)UsePass ,GrabPass ,SubShader Tags的更多相关文章

  1. Unity3d Shader开发(二)SubShader

    (1)SubShader Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 当Un ...

  2. Unity3d Shader开发(三)Pass(Blending )

    混合被用于制作透明物体. 当图像被渲染时,所有着色器被执行以后,所有贴图被应用后,像素将被写到屏幕.他们是如何通过Blend命令的控制和已有的图像合并呢? Syntax 语法 Blend Off Tu ...

  3. Unity3d Shader开发(三)Pass(Pass Tags,Name,BindChannels )

    Pass Tags 通过使用tags来告诉渲染引擎在什么时候该如何渲染他们所期望的效果. Syntax 语法 Tags { "TagName1" = "Value1&qu ...

  4. 【Unity3D游戏开发】基础知识之Tags和Layers (三二)[转]

    Tags和Layers分别表示是Unity引擎里面的标签和层,他们都是用来对GameObject进行标识的属性,Tags常用于单个GameObject,Layers常用于一组的GameObject.添 ...

  5. Unity3d Shader开发(五)Fallback ,Category

    Fallback定义在所有子着色器后.简单来说,它表示"如果没有任何子着色器能被运行在当前硬件上,请尝试使用降级着色器". Syntax 语法 Fallback "nam ...

  6. Unity3d Shader开发(三)Pass(Alpha testing )

    透明度测试是阻止像素被写到屏幕的最后机会. 在最终渲染出的颜色被计算出来之后,可选择通过将颜色的透明度值和一个固定值比较.如果比较的结果失败,像素将不会被写到显示输出中. Syntax 语法 Alph ...

  7. Unity3d Shader开发(三)Pass(Texturing )

    纹理在基本的顶点光照被计算后被应用.在着色器中通过SetTexture 命令来完成.   SetTexture 命令在片面程序被使用时不会生效:这种模式下像素操作被完全描述在着色器中. 材质贴图可以用 ...

  8. Unity3d Shader开发(三)Pass(Culling & Depth Testing)

    剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施.所有几何体都包含正面和反面.剔除基于大多数对象都是封闭的事实:如果你有一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因 ...

  9. Unity3d Shader开发(三)Pass(Color, Material, Lighting )

    材质和灯光参数被用于控制内置顶点光照.顶点光照是Direct3D/OpenGL标准的按每顶点计算的光照模型.光照打开时,光照受材质块,颜色材质和平行高光命令的影响. 每像素光照常被实现为自定义顶点/片 ...

随机推荐

  1. 自定义控件(视图)1期笔记02:View的绘制流程

    1. 引言: 来自源码的3个方法: (1)public final void measure():测量,用来控制控件的大小,final不建议覆写 (2)public void layout():布局, ...

  2. LVS配置与安装

    IP和主机准备: 准备VIP :20.20.20.1 lvs主机 :172.24.22.70 HA主机:172.24.22.4 包准备:ipvsadm-1.24.tar.gz 1.安装前配置包  2. ...

  3. jquery用on代替bind(),live(),delegate()的方法

    Js的功能确实非常强大,奈何我一个php程序员一直在js上没有投入足够的精力去研究,每次遇到不会的都是去百度,以后有时间真的应该买本书系统的学习一下 // Bind $( "#members ...

  4. spark stream初探

    spark带了一个NetworkWordCount测试程序,用以统计来自某TCP连接的单词输入: /usr/local/spark/bin/run-example streaming.NetworkW ...

  5. Spark1.2新特性概述

    http://mp.weixin.qq.com/s?__biz=MjM5NTc2MTg3Mw==&mid=201641685&idx=1&sn=1b75be3d774bb3f2 ...

  6. oracle-替换 换行符和空格符

    --换行或空格: )), '') --换行及空格: update tableName set columnName= ), ), '')

  7. 两天来学习C的感受

    大学的时候曾经学习过C语言,教科书是谭浩强的绿色的书.当时根本没有好好学习,期末考试是靠老师画重点才过的. 那个时候稀里哗啦的完全听不明白,最揪心的是指针和文件操作(当时根本不知道这个世界上还有DB存 ...

  8. Extjs4使用iframe注意事项

    "video" : { render : function(panel, eOpts) { // 因为iframe在video // panel渲染的时候就已经完全移动到video ...

  9. jQuery Table2CSV插件(表格转CSV) 完美支持colspan和rowspan

    table2csv:将表格转化为csv数据 参数:一个JSON对象 { 'repeatChar':'拆分单元格填充字符', //默认为null则将单元格值填充到拆分的每个单元格中,如果给定字符串则用给 ...

  10. oracle随笔(转)

    ---------数学函数 1.绝对值S:select abs(-1) valueO:select abs(-1) value from dual 2.取整(大)S:select ceiling(-1 ...