纳金网

标题: 圆形小地图的制作 [打印本页]

作者: 晃晃    时间: 2011-11-16 17:16
标题: 圆形小地图的制作


           后面有一个场景包,关于小地图的布局,里面看一下就知道了,前提是你有一定的shader基础并指导Unity中图形的渲染管道线,不然我这一片文章没法教你所有的shader知识。这个小地图的大概思想是:用一个相机正交观察一个小地图图片,小地图的上面有一个圆形中空的Mesh,通过这个Mesh将小地图圆形以外的部分“覆盖掉”。怎么贴图片啊 ?悲剧。 里面的shader完成了主要的工作,下面我就将这个简单的shader做一下讲解:
         

           先看Mesh使用的Shader:
         

           Shader "Transparent/Alpha_Cancel" {
           

           Properties {
           

            _Color ("Main Color", Color) = (1,1,1,1)
           

            _SpecColor ("Spec Color", Color) = (1,1,1,0)
           

            _Emission ("Emissive Color", Color) = (0,0,0,0)
           

            _Shininess ("Shininess", Range (0.1, 1)) = 0.7
           

            _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
           

           }
         

           SubShader {
           

            Tags {"Queue"="Geometry+999" "IgnoreProjector"="True" "RenderType"="Transparent"}
           

            LOD 100
           

            
           

            Alphatest Less 0.9
           

            ZWrite on
           

            Blend SrcAlpha OneMinusSrcAlpha
           

            ColorMask RGB
           

            
           

            // Non-lightmapped
           

            Pass {
           

             Tags { "LightMode" = "Vertex" }
           

             Fog { Mode off }
           

             /*Material {
           

              Diffuse [_Color]
           

              Ambient [_Color]
           

              Shininess [_Shininess]
           

              Specular [_SpecColor]
           

              Emission [_Emission]
           

             }*/
           

             Lighting On
           

             SeparateSpecular On
           

             SetTexture [_MainTex] {
           

             constantColor(0,0,0,0)
           

              Combine constant * primary DOUBLE, constant * primary
           

             }
           

            }
           

            }
           

           }
         

           1 "Queue"="Geometry+999" .Queue这个参数用来设置Unity中物体的渲染顺序,有4个分界点值,从小到大分别为 Background Geometry Transparent Overlay  值越小越先被渲染。
         

           2ZWrite on开启深度缓存,默认深度测试的规则是Less
         

           3Blend SrcAlpha OneMinusSrcAlpha
           

           利用当前计算的像素Alpha值和屏幕存在的像素的Alpha值混合呈现透明效果
         

           他和下面的SetTexture相联系,看SetTexture中,Alpha的值被设置成constant * primary,即0
           

            
         

           所以当Blend的时候,Mesh呈现出全透明。
         

           4现在知道了Mesh有全透明的功能,现在来看看Mesh和小地图图片的渲染先后顺序。
         

           Mesh的shader中 "Queue"="Geometry+999" .
         

           小地图的shader中"Queue"="Transparent+1" 可见Mesh要比小地图先渲染
         

           下面我们来模拟下过程:
         

           1当场景被天空盒渲染后,接下来要渲染Mesh网格,因为Mesh有全透明的功能,所以这个中间带圆形孔的Mesh会出现背景天空盒的样子。
         

           2然后绘制小地图图片,因为开启了深度测试,当当前将要绘制的像素值的z深度比当前屏幕像素的z深度要浅的时候,就绘制当前将要绘制的像素,反之则不绘制。可见因为小地图图片所在的位置位于Mesh的较深处,而Mesh又有圆形中空,圆形中空部分的像素是天空盒像素 ,深度当然比小地图的要深,所以该部分小地图会覆盖天空盒像素。而圆形四周的部分因为是属于Mesh的,该处的深度较小地图的浅,所以小地图上面该处的像素将不被绘制。
         

作者: 奇    时间: 2012-2-9 23:26
无聊时可以刷屏幕 灌水 也可以试试 帖子的标题究竟可以写多长

作者: tc    时间: 2012-2-12 23:28
我也来支持下

作者: 晃晃    时间: 2012-3-8 23:30
我来顶个

作者: 菜刀吻电线    时间: 2012-3-17 23:28
不错哦,顶一下......

作者: 奇    时间: 2012-6-8 23:22
不错不错,收藏了

作者: C.R.CAN    时间: 2012-8-2 00:33
你们都躲开,我来顶

作者: C.R.CAN    时间: 2012-8-24 00:12
你们都躲开,我来顶

作者: 菜刀吻电线    时间: 2012-9-10 08:34
读铁系缘分,顶铁系友情

作者: tc    时间: 2012-10-15 23:25
好铁多多发,感激分享

作者: 菜刀吻电线    时间: 2013-2-12 23:28
真不错,全存下来了.

作者: tc    时间: 2013-2-24 23:23
发了那么多,我都不知道该用哪个给你回帖了,呵呵

作者: nts    时间: 2013-10-17 10:47
如果可以切割就好了
作者: 幸福小猪    时间: 2013-10-28 11:05
感谢楼主分享
作者: 小海豚    时间: 2013-10-29 18:07
看不懂。。。




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5