排列三遗漏本期关注: zhang273162308 Unity&Shader案例篇—光锥扫描效果

197
回复
3383
查看
打印 上一主题 下一主题
  [ 复制链接 ]
排名
142
昨日变化

排列三2014079期正版藏机图 www.d0po.cn 120

主题

564

帖子

6901

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
108
蛮牛币
5161
威望
0
注册时间
2013-9-10
在线时间
1484 小时
最后登录
2019-4-30

专栏作家活力之星游戏蛮牛QQ群会员蛮牛哥

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
一、介绍
      在Unity2018.2.14上,一个实现展示敌方视线扇形光锥效果的Shader,其效果图如图所示,当然这种效果还只是实现了一个视线光锥的简单效果

当这个视线光锥开始扫描的时候,为了表达更加真实的效果,在出现扫描到障碍物的时候,会出现光线被遮挡的效果。如图所示:当光锥扫描到前面的障碍物的时候,会出现光线被遮挡的效果。

二、实现
1、简单半透明扫描扇形光锥Shader代码
游客,如果您要查看本帖隐藏内容请回复


这个Shader只是实现了静态的扇形扫描光锥效果,接下来还有实现光锥转动的时候扫描到障碍物时候的效果。
2、动态扫描
先将光锥的角度进行微分处理,每个单位角度的方向指定距离处得到一个点。由物体向该点发射一个射线,进行射线检测。射线碰到有碰撞体的物体就会得到一个碰撞点,然后将点与扫描半径的比值赋给Shader代码里的深度缓存数组  m_aDepthBuffer。如果没有碰撞到障碍物则赋值为-1。在Shader代码里
[AppleScript] 纯文本查看 复制代码
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'


Shader "ShaderPack/ConeOfSight" {
        Properties{
                _Color("Color",Color) = (1,1,1,1)
                _SightAngle("SightAngle",Float) = 0.5
                _FarHardness("FarHardness",Float) = 0.5
                _RangeHardness("RangeHardness",Range(0,100)) = 5
                _RangeStep("RangeStep",Range(0,1)) = 0.7
                _SourceWhiteness("SourceWhiteness",Range(0,1)) = 1
                //_SourceGlow("SourceGlow",Range(1,10)) = 1
        }

                SubShader{
                        Tags {
                                "Queue" = "Transparent"
                                "RenderType" = "Transparent"
                        }
                        Blend SrcAlpha OneMinusSrcAlpha

                        Pass{
                                ZWrite Off
                                CGPROGRAM

                                #pragma vertex vert
                                #pragma fragment frag

                                #include "UnityCG.cginc"

                                struct v2f {
                                        float4 position : SV_POSITION;
                                        float4 uv : TEXCOORD0;
                                };

                                half4 _Color;
                                half _SightAngle;
                                half _FarHardness;
                                half _RangeHardness;
                                half _RangeStep;
                                half _SourceWhiteness;
                                //half _SourceGlow;

                                //uniform half _CurrentAngle = 0;
                                //int _BufferSize = 64;
                                uniform float _SightDepthBuffer[256];

                                //Vertex
                                v2f vert(appdata_base IN) {
                                        v2f o;
                                        o.position = UnityObjectToClipPos(IN.vertex);
                                        o.uv = IN.texcoord;
                                        return o;
                                }

                                //Fragment
                                fixed4 frag(v2f IN) : SV_Target{
                                        const float PI = 3.14159;

                                        IN.uv.x -= 0.5f;
                                        IN.uv.y -= 0.5f;
                                        half distcenter = 1 - sqrt(IN.uv.x*IN.uv.x + IN.uv.y*IN.uv.y) * 2;

                                        half2 fragmentDir = normalize(IN.uv.xy);
                                        half viewDotPos = clamp(dot(half2(1,0), fragmentDir),0,1);
                                        half sightAngleRads = _SightAngle / 2 * PI / 180;
                                        half sightVal = cos(sightAngleRads);

                                        half4 col = lerp(_Color,half4(1,1,1,1),distcenter*_SourceWhiteness);
                                        col.a *= pow(viewDotPos / sightVal,_RangeHardness) *distcenter * pow(distcenter,_FarHardness);

                                        //col.a *= clamp(distcenter*abs(pow(col.a,-_FarHardness*10)),0,1);
                                        if (viewDotPos < sightVal) 
                                        {
                                                col.a *= _RangeStep;
                                        }
                                        else 
                                        {
                                                // --- Depth check
                                                float fragmentAngle = asin(fragmentDir.y) + sightAngleRads;
                                                float fragmentVal = 1.0f - (fragmentAngle) / (sightAngleRads * 2);
                                                int index = fragmentVal * 256;
                                                if (_SightDepthBuffer[index] > 0 && (1 - distcenter) > _SightDepthBuffer[index])
                                                        col *= 0;
                                        }

                                        col.a *= _Color.a;
                                        return col;
                                }

                                ENDCG
                        }
        }

}



进行判断的时候就会将碰撞到障碍物的后面的透明度都设置为0,这样就实现了光线被遮挡的效果。代码如下:
游客,如果您要查看本帖隐藏内容请回复

三、总结
1、实现了光锥扫描到障碍物的动态效果
2、不足之处是该扫描效果紧紧是水平面的效果,不能做到立体的效果
3、工程下载地址
游客,如果您要查看本帖隐藏内容请回复



2初来乍到
123/150
排名
18789
昨日变化

1

主题

35

帖子

123

积分

Rank: 2Rank: 2

UID
218899
好友
1
蛮牛币
253
威望
0
注册时间
2017-4-22
在线时间
55 小时
最后登录
2019-3-26
沙发
2019-2-21 16:55:48 只看该作者
来学习学习,打算做一个俯视视角的游戏需要这样的功能
3偶尔光临
283/300
排名
7735
昨日变化

0

主题

24

帖子

283

积分

Rank: 3Rank: 3Rank: 3

UID
250515
好友
0
蛮牛币
129
威望
0
注册时间
2017-10-24
在线时间
97 小时
最后登录
2019-4-29
板凳
2019-2-21 17:20:49 只看该作者
来学习学习,打算做一个俯视视角的游戏需要这样的功能
3偶尔光临
171/300
排名
11370
昨日变化

2

主题

25

帖子

171

积分

Rank: 3Rank: 3Rank: 3

UID
116279
好友
0
蛮牛币
579
威望
0
注册时间
2015-8-2
在线时间
56 小时
最后登录
2019-2-21
地板
2019-2-21 17:22:04 只看该作者
6666666666666666
3偶尔光临
171/300
排名
11370
昨日变化

2

主题

25

帖子

171

积分

Rank: 3Rank: 3Rank: 3

UID
116279
好友
0
蛮牛币
579
威望
0
注册时间
2015-8-2
在线时间
56 小时
最后登录
2019-2-21
5#
2019-2-21 17:24:45 只看该作者
不错,学习6666666666
3偶尔光临
171/300
排名
11370
昨日变化

2

主题

25

帖子

171

积分

Rank: 3Rank: 3Rank: 3

UID
116279
好友
0
蛮牛币
579
威望
0
注册时间
2015-8-2
在线时间
56 小时
最后登录
2019-2-21
6#
2019-2-21 17:26:50 只看该作者
学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习
7日久生情
2011/5000
排名
1897
昨日变化

41

主题

737

帖子

2011

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
214924
好友
4
蛮牛币
17677
威望
0
注册时间
2017-3-28
在线时间
517 小时
最后登录
2019-4-30
7#
2019-2-21 17:44:00 只看该作者
7日久生情
2218/5000
排名
1089
昨日变化

30

主题

322

帖子

2218

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
82788
好友
25
蛮牛币
7393
威望
0
注册时间
2015-3-21
在线时间
804 小时
最后登录
2019-4-29
8#
2019-2-21 17:58:09 只看该作者
这个好,谢谢楼主
7日久生情
1622/5000
排名
1160
昨日变化

1

主题

65

帖子

1622

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
179667
好友
1
蛮牛币
6641
威望
0
注册时间
2016-10-31
在线时间
564 小时
最后登录
2019-4-23
9#
2019-2-21 18:17:29 只看该作者
6+66666666666666
8常驻蛮牛
5225/10000
排名
32
昨日变化

31

主题

540

帖子

5225

积分

Rank: 8Rank: 8

UID
47602
好友
5
蛮牛币
25275
威望
0
注册时间
2014-10-3
在线时间
1480 小时
最后登录
2019-5-1
10#
2019-2-21 19:54:01 只看该作者
多谢版主分享,很好的资源。
7日久生情
2235/5000
排名
1394
昨日变化

0

主题

693

帖子

2235

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
135463
好友
0
蛮牛币
180
威望
0
注册时间
2016-1-23
在线时间
652 小时
最后登录
2019-5-1
11#
2019-2-21 21:16:26 只看该作者
66666666666666666666666
7日久生情
2163/5000
排名
758
昨日变化

7

主题

264

帖子

2163

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
167044
好友
0
蛮牛币
3291
威望
0
注册时间
2016-9-6
在线时间
658 小时
最后登录
2019-5-1
12#
2019-2-21 21:20:22 只看该作者
厉害了这个 看着很厉害
7日久生情
1714/5000
排名
2263
昨日变化

0

主题

643

帖子

1714

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
182268
好友
2
蛮牛币
758
威望
0
注册时间
2016-11-9
在线时间
450 小时
最后登录
2019-4-22
13#
2019-2-21 21:37:11 只看该作者
超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊
5熟悉之中
786/1000
排名
4013
昨日变化

1

主题

72

帖子

786

积分

Rank: 5Rank: 5

UID
14034
好友
0
蛮牛币
246
威望
0
注册时间
2014-2-10
在线时间
343 小时
最后登录
2019-5-1
14#
2019-2-21 21:42:31 只看该作者
支持一下~~~~~~~~
7日久生情
2994/5000
排名
516
昨日变化

0

主题

163

帖子

2994

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
57299
好友
3
蛮牛币
2079
威望
0
注册时间
2014-11-24
在线时间
1349 小时
最后登录
2019-4-29
15#
2019-2-21 22:07:40 只看该作者
谢谢楼主分享?。?!
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

  • 【人事】中共临汾市委组织部公示3名拟任职干部 2019-05-18
  • 习近平与人民日报那些事 2019-05-10
  • 很多常用药同属一家族 2019-04-30
  • 小牛犊天生两条腿 走起路来像袋鼠 2019-04-30
  • 就因为“阶级亲”,才应把这些难民送到欧洲。欧洲生活水平高呀,让亲人生活的更好。不能让他们到中国受苦受难呀。 2019-04-27
  • 资管新规来了!打破刚兑  投资者怎么办? 2019-04-27
  • 紫光阁中共中央国家机关工作委员会 2019-04-24
  • 图解:习近平主席这12个金句振奋人心! 2019-04-24
  • 您访问的页面找不回来了 2019-04-07
  • 五莲科技局以“三大”助力动能转换 2019-04-07
  • 匹夫有责之一百一十二—道义大义的博客—强国博客—人民网 2019-03-30
  • 守住青山不放松 护好绿水不辞难——在渝全国人大代表聚焦“共抓大保护、不搞大开发”专题调研记略 2019-03-28
  • 经营者要想“我心换你心”,就要未雨绸缪,让不诚信的诱惑少一点,如此才能在市场中生存下来。反过来说,承担不起亏损就关门歇业,是否也是一种不诚信呢? 2019-03-21
  • 追风上市公司“跌落神坛”-热门标签-华商网数码 2019-03-21
  • 文化艺术交易场所沙龙第一期活动在京顺利举行 2019-03-16
  • 147| 37| 490| 497| 666| 669| 258| 192| 493| 334|