【ShaderLab学习】RenderQueue理解

RenderQueue

默认情况下,Unity会基于对象距离摄像机的远近来排序你的对象。因此,当一个对象离摄像机越近,它就会优先绘制在其他更远的对象上面。对于大多数情况这是有效并合适的,但是在一些特殊情况下,你可能想要自己控制对象的绘制顺序。而使用Tags{}块我们就可以得到这样的控制。

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

示例:

    Tags { "Queue"="Geometry" }
    Tags { "Queue"="Geometry-20" }

同时需在SubShader中显示声明ZWrite Off,通知Unity我们会重写物体的渲染深度排序。

PropertiesValue渲染队列描述
Background1000This render queue is rendered before any others.这个队列通常被最先渲染(比如 天空盒)。
Geometry2000Opaque geometry uses this queue.这是默认的渲染队列。它被用于绝大多数对象。不透明几何体使用该队列。
AlphaTest2450Alpha tested geometry uses this queue.需要开启透明度测试的物体。Unity5以后从Geometry队列中拆出来,因为在所有不透明物体渲染完之后再渲染会比较高效。
GeometryLastLast render queue that is considered “opaque”.所有Geometry和AlphaTest队列的物体渲染完后
Transparent3000This render queue is rendered after Geometry and AlphaTest, in back-to-front order.所有Geometry和AlphaTest队列的物体渲染完后,再按照从后往前的顺序进行渲染,任何使用了透明度混合的物体都应该使用该队列(例如玻璃和粒子效果)
Overlay4000This render queue is meant for overlay effects.该队列用于实现一些叠加效果,适合最后渲染的物体(如镜头光晕)。
深度缓冲

深度缓冲(depth buffer | z-buffer)决定哪些物体渲染在前面,哪些物体渲染在后面。基本思想:根据深度缓冲中的值来决定该片元距离摄像机的距离(开启深度测试的前提下),当渲染这个片元时,把它的深度值和已经存在在深度缓冲中的值进行比较(开启深度写入的前提下),如果它的值距离摄像机更远,说明这个片元不用渲染(有物体挡住了它),否则,这个片元应该覆盖掉颜色缓冲中的像素值,并把它的深度值写入深度缓冲中(开启深度写入的前提下)。

关于深度缓冲更详细的分析:https://blog.csdn.net/liyaxin2010/article/details/83382940

而要实现透明效果,第一种办法开启透明度测试(Alpha Test),但是这种无法得到真正的半透明混合;另一种是透明度混合(Alpha Blend)

后面再来详解这两种实现的区别。


参考:
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用shaderlab编写的基于spriterender的动态扩散shader: ``` Shader "Custom/DynamicDiffusion" { Properties { _MainTex("Base (RGB)", 2D) = "white" {} _DiffusionSize("Diffusion Size", Range(0.01, 1.0)) = 0.1 _DiffusionSpeed("Diffusion Speed", Range(0.01, 1.0)) = 0.1 _DiffusionColor("Diffusion Color", Color) = (1, 1, 1, 1) } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent"} Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float _DiffusionSize; float _DiffusionSpeed; float4 _DiffusionColor; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); float center = 0.5; float distance = distance(i.uv, float2(center, center)); float diffusion = smoothstep(center - _DiffusionSize, center, distance); float time = _Time.y * _DiffusionSpeed; float2 offset = _DiffusionColor.rg * (diffusion * sin(time) + (1 - diffusion) * cos(time)); float2 distortionUV = i.uv + offset; col += tex2D(_MainTex, distortionUV) * _DiffusionColor.rgb; return col; } ENDCG } } FallBack "Diffuse" } ``` 该shader包含以下属性: - _MainTex:Sprite的纹理贴图 - _DiffusionSize:扩散效果的大小 - _DiffusionSpeed:扩散效果的速度 - _DiffusionColor:扩散效果的颜色 在顶点着色器中,使用UnityObjectToClipPos函数将顶点位置从对象空间转换为剪辑空间。 在片段着色器中,使用tex2D函数获取纹理贴图的颜色值。通过计算距离中心点的距离,使用smoothstep函数创建扩散效果。使用sin和cos函数创建动态扭曲效果。将扩散效果和动态扭曲效果结合,使用tex2D函数获取扭曲后的纹理颜色值,最后将其与DiffusionColor相乘,得到最终的颜色值。 可以在Shader Inspector窗口中调整DiffusionSize、DiffusionSpeed和DiffusionColor的值,以达到所需的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值