突然发现换了阿里云的空间就支持 wp的 中文链接了,好赞。。
言归正传,今天做了一个 光晕的效果, 参考的是Nehe 的Opengl教程, 以前一直没做过这个东西就有点好奇,做完后,发现效果特别赞,又简单,但是遇到了 RenderQueue 的一些bug,记录一下。
有人肯定会说Unity3d 自身可以创建 LensFlare 效果,为什么还要自己搞,我看了下,貌似 LensFlare必须绑定到 Light 上才有效果,而且准备素材的时候很麻烦,简单的黑白图调色都不行,还是自己写吧。
再说说 Nehe教程中判断 某点 是否在视野内, 是通过获取相机的视椎体,然后监测某点是否在视椎体的6个平面内。。。 感觉这个真麻烦,直接将 点 通过 mvp 矩阵转换到屏幕空间,然后判断该点坐标是否 x,y > 0 && x,y < 1 即可。 好吧,又跑题了。。。
如图,编写了一个Shader, RenderQue=”Overlay” ZWrite Off ZTest Off
发现在场景有其他 GameObject 的地方,图片都能正确的挡住它们,但是当背景为天空盒的时候,确被天空盒挡住了, 根据常识理解这不应该, 天空盒应该是在实体层渲染的, 不应该会挡住, 然后在 Shader 中就算改成 Overlay+99999 也是毫无效果。。。
请不要无脑复制转载本文, 由 dreamfairy 原创, 转载请注明出处 本文地址 http://www.dreamfairy.cn/blog/2016/05/25/%e6%b5%85%e8%b0%88-unity3d-%e7%9a%84-renderqueue/
Shader就是这个咯
Shader "Unlit/Overlayer2" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color("Color", Color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Opaque" "Queue"="Overlay+99999"} //Blend SrcAlpha One ZWrite Off ZTest Off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _Color; v2f vert (appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed a = tex2D(_MainTex, i.uv).r; fixed4 col = fixed4(_Color.rgb * a, a); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }
于是上 u3d 的官网论坛逛逛,发现一群老外在那边喊 ZTest Always 啊, ZWrite On 啊。。
拜托,如果开启了 ZTest Always 的话,就会影响到UI的层级关系了,因为UI总是 ZTest Always保持最上的, 一个场景特效的问题应该在场景内解决, ZWrite On 更不行了,会导致半透明部分遮挡的天空盒部分无法渲染。
然后写了个 Debug Scrpit做测试,看看RenderQueue 是多少。
using UnityEngine; using System.Collections; public class GetQueue : MonoBehaviour { public int Queue; // Use this for initialization void Start () { } // Update is called once per frame void Update () { Renderer renderer = this.gameObject.GetComponent<Renderer> (); Queue = renderer.sharedMaterial.renderQueue; } }
看完居然是后,发现 Queue 居然不是 4000(Overlay)+99999.. 好吧,你赢咯.
百思不得其解的情况下,我给材质重设了一次Shader, 再次启动居然ok了。。。 绕了好大一圈。。。
改了Shader居然不会刷新,必须手动设置一次, 关了Unity 重开都不会刷新。。。