加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

shader实例(十五)渲染队列进行深度排序

(2014-12-03 21:13:41)
标签:

深度排序

渲染队列

unityshader

分类: Shader

这几天忙着换UI,不仅是身体累,心也累。美术主管感觉下面的人画的不好,换!运营期,运营老大说界面不好,换!一个网页游戏非要折腾到第四版界面,真是闲得没事做,游戏的好坏跟界面换不换有很大的关系吗?至少从小玩游戏到大就没感觉那个游戏因为画面好看而成为经典,更何况是界面。吐吐槽,哈哈,工作嘛,做多了无脑体力活厌倦也正常。感觉游戏开发取舍很重要,最主要的是找到平衡点,不要为了做功能而开发游戏,玩家不是傻子,要有一颗把自己当玩家的心!http://www/uc/myshow/blog/misc/gif/E___7393ZH00SIGG.gif好像废话太多了,进入正题。。。

 

深度排序可以理解为photoshop中的图层概念,可以控制物体显示的层级顺序,Unity提供这样的内置标签,方便我们自由控制。

实例如下:

1.创建一个平面和两个球体,如下:

http://s2/mw690/002wvREMgy6O6e2XAeB21&690
2.编写shader,注意红色部分为深度的控制代码。

Shader "Custom/Depth" { 
    Properties { 
        _MainTex ("Base (RGB)", 2D) = "white" {} 
   
    SubShader { 


        Tags { "Queue"="Geometry-20" } //设置渲染顺序,Geometry为2000,-20表示在所有几何体后面显示
        ZWrite Off                                      //告诉Unity我们想自己控制该对象的渲染顺序,而不写到深度缓冲中


        LOD 200  
        CGPROGRAM 
        #pragma surface surf Lambert  
        sampler2D _MainTex;  
        struct Input { 
            float2 uv_MainTex; 
        };  
        void surf (Input IN, inout SurfaceOutput o) { 
            half4 c = tex2D (_MainTex, IN.uv_MainTex); 
            o.Albedo = c.rgb; 
            o.Alpha = c.a; 
       
        ENDCG 
    
    FallBack "Diffuse" 
}

3.将上面的shader加到前面的那个大的球体上,效果如下:

http://s13/mw690/002wvREMgy6O6esu0Jm8c&690
可以看到大的球体在最后面了,不过它的影子没有变化,在这里只是手动去控制它的渲染顺序了。

 

默认情况下,unity会根据物体与摄像机的距离来决定渲染顺序,但是在特殊情况下,我们需要控制物体的渲染顺序,这时使用Tags模块就可以了。

Unity已经提供了一些默认的渲染队列,每个渲染队列都有一个唯一值来确定何时将物体渲染到屏幕,如下:

渲染队列 渲染队列描述 渲染队列值
Background 这个队列被最先渲染。它被用于skyboxes等。 1000
Geometry 这是默认的渲染队列。它被用于绝大多数对象。不透明几何体使用该队列。 2000
AlphaTest 通道检查的几何体使用该队列。它和Geometry队列不同,对于在所有立体物体绘制后渲染的通道检查的对象,它更有效。 2450
Transparent 该渲染队列在Geometry和AlphaTest队列后被渲染。任何通道混合的(也就是说,那些不写入深度缓存的Shaders)对象使用该队列,例如玻璃和粒子效果。 3000
Overlay 该渲染队列是为覆盖物效果服务的。任何最后被渲染的对象使用该队列,例如镜头光晕。 4000

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有