找回密码
 立即注册
查看: 2697|回复: 10

[特效Shader] Unity3d shader中Queue 解释

[复制链接]
发表于 2018-8-21 15:00 | 显示全部楼层 |阅读模式
资源信息 Tutorial Information
教程名称: Unity3d shader中Queue 解释(发帖教程)
适用引擎: Unity3D  (适用引擎,为空默认为Unity)
教程语种: 中文
教程等级: 1
教程格式: 图文(请用IE9以上浏览器访问本版块)
教程作者: 转载自互联网 (如有问题请短消息联系作者或发表回复)
下载地址: (兑换积分)
点击查看原图
美丽分割线
为了让我们真正明白透明度,我们需要了解一下深度排序,或者说,对象的绘制顺序。Unity允许我们控制一个特定对象绘制到屏幕上的顺序,因此我们可以更好地控制哪些对象应该覆盖在其他对象上。你可以把绘制顺序理解成Photoshop中的图层的概念。在处理透明度或者类似界面对象的元素时,绘制顺序尤其重要。


本篇将会讲解如何使用Unity内置的标签(tags)来利用这个分层化的方法去渲染你的对象。这是非常重要的,因为你将会更好地控制你的对象是如何被绘制到游戏界面的。

准备工作:
  • 创建一个新的场景,以及两个球体,并且让它们排在一条线上。我们的目标是(没有蛀牙!),无论它们在3D空间中的实际坐标是什么,我们可以随你所欲地安排它们的绘制顺序,即谁在谁的上面。
  • 为了可以看出修改绘制顺序发生的变化,我们还需要至少两个Shaders。所以,我们创建两个新的Shaders,并可以分别分别命名为Depth001和Depth002。
  • 你的场景应该看起来和下面图片类似





实现

Shader部分的代码实际上很简单;它仅仅需要两行新代码就可以了。
1.首先我们决定将目标象绘制到一个新的渲染队列中。为了做到这一点,我们需要修改Tags{}块,也就是在SubShader{}的内部:
  1. Tags { "Queue"="Geometry-20" }  
复制代码
2.然后,我们需要告诉Unity,我们想要自己控制这个对象的渲染顺序,而不想写到深度缓存中。在上一步代码的下面添加如下代码:
  1. ZWrite Off  
复制代码
保存,返回Unity查看。你将会发现其中一个球体出现在所有对象的后面,甚至当它的3D空间中的实际坐标在所有对象前面时也是一样。如下图所示:



  1. Shader "Custom/Depth001" {  
  2.     Properties {  
  3.         _MainTex ("Base (RGB)", 2D) = "white" {}  
  4.     }  
  5.     SubShader {  
  6.         Tags { "Queue"="Geometry-20" }  
  7.          
  8.         ZWrite Off  
  9.          
  10.         LOD 200  
  11.          
  12.         CGPROGRAM  
  13.         #pragma surface surf Lambert  
  14.   
  15.         sampler2D _MainTex;  
  16.   
  17.         struct Input {  
  18.             float2 uv_MainTex;  
  19.         };  
  20.   
  21.         void surf (Input IN, inout SurfaceOutput o) {  
  22.             half4 c = tex2D (_MainTex, IN.uv_MainTex);  
  23.             o.Albedo = c.rgb;  
  24.             o.Alpha = c.a;  
  25.         }  
  26.         ENDCG  
  27.     }   
  28.     FallBack "Diffuse"  
  29. }  
复制代码
解释
默认情况下,Unity会基于对象距离摄像机的远近来排序你的对象。因此,当一个对象离摄像机越近,它就会优先绘制在其他更远的对象上面。对于大多数情况这是有效并合适的,但是在一些特殊情况下,你可能想要自己控制对象的绘制顺序。而使用Tags{}块我们就可以得到这样的控制。

Unity提供给我们一些默认的渲染队列,每一个对应一个唯一的值,来指导Unity绘制对象到屏幕上。这些内置的渲染队列被称为Background, Geometry, AlphaTest, Transparent, Qverlay。这些队列不是随便创建的,它们是为了让我们更容易地编写Shader并处理实时渲染的。下面的表格描述了这些渲染队列的用法:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2018-9-17 07:58 | 显示全部楼层
很不错
发表于 2018-9-17 07:38 | 显示全部楼层
好帖就是要顶
发表于 2018-9-17 07:07 | 显示全部楼层
顶顶多好
发表于 2018-9-17 07:28 | 显示全部楼层
很好哦
发表于 2018-9-17 07:34 | 显示全部楼层
LZ真是人才
发表于 2019-5-3 08:36 | 显示全部楼层
好帖就是要顶
发表于 2019-5-3 09:11 | 显示全部楼层
顶顶多好
发表于 2019-5-3 08:58 | 显示全部楼层
难得一见的好帖
发表于 2019-5-3 08:56 | 显示全部楼层
说的非常好
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-22 15:51 , Processed in 0.109669 second(s), 32 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表