欢迎光临散文网 会员登陆 & 注册

BlockOS开发日志(番外一)实现准星

2023-03-03 00:45 作者:Zerous  | 我要投稿

做地形生成算法好累哦,来点休闲的UI时间233。

作为一款开放世界沙盒游戏,玩家所处的环境必然是多种多样的。可能前一秒在雪地,后一秒就到洞穴里去了。准星也是有颜色的,如果是白准星,可能在雪地里看不清;黑准星到洞穴里又看不清。要如何保证玩家何时何地都能看清准星之类的UI呢?(当然是摸着别的游戏过河

于是我找了找手头上几款有准星的游戏,看看它们是如何实现准星的。

原神
Apex Legends
Minecraft

可以看到原神和Apex都是给对应的准星加上一个轮廓,而Minecraft则是用到了一个似乎是反色的效果。

那就,做两个版本好了(

嗯,准星首先要有十字准星。为了表示挖掘方块或者是为物品充能,还可以加个进度条。然后我觉得fps游戏里能看方向很酷,所以加了方向指示器。。。emmm最后做出来是这个样子的:

是不是很酷(描边法的最简单就先用描边的做了)

这边方向指示器的实现是把方向向量的x,z分量映射到'N'图片位置的-x,y上,y映射到'N'图片的alpha值和缩放值实现的。所以有这样的情况:

朝上看
朝下看

感觉做的还是很有趣的hhh,至少我自己很满意。硬要说问题的话,就是很有可能让玩家把注意力都集中到准星上了吧。说完了自定义控件,下面说说它们这些特效的实现。

首先明确实现特效的需求:让准星能够在任何环境下被玩家看清。在先前的参考中,已经知道了有两种方案可行。一种是加描边的方案,一种是让显示的内容反色的方案。

第一种方案在Unity上实现很简单,直接加上Outline组件就好了。实现方法一个是在片段着色器上做上下左右采样判断当前片段是否处在边缘外围,如果是就输出描边颜色。而Unity的Outline的组件应该是创建了4份网格涂黑然后做一定方向的偏移实现的。

在Wireframe模式下看得很清楚(左:加了Outline组件,右:没加Outline组件)

用着色器实现描边好处是三角数少,但是会遇到描边可能超出面的范围的问题。Outline的实现直接让三角面的数量翻了4倍,但是视觉效果还是很不错的。

第二种方案就必须得上着色器了。对于我这个只能说了解TA的人来说,我第一个瞬间想到的是用后处理+模版缓冲来做= =。

后面找了好久资料才意识到可以用颜色混合来做,除了用颜色混合来做透明外,它是可以自定义计算公式的,因此可以让输出的颜色减去颜色缓冲的颜色来实现反色。

然后简单丢掉alpha过小的像素,就实现了下面的效果:

反色!

但是另一个问题出现了:因为占用了透明需要的颜色混合,所以透明不起效了。不过我的游戏经验告诉我可以把模型的一部分片段丢掉变成一个个散开的点来实现透明。查了一下这个技术叫做Screen Door Transparency。然后简单复制了下实现,把透明用这种方式解决了。

Screen Door Transparency

所以我一天就做了个准星?!?

参考

https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/03%20Blending/

https://www.jianshu.com/p/c68a730e9a8b

https://digitalrune.github.io/DigitalRune-Documentation/html/fa431d48-b457-4c70-a590-d44b0840ab1e.htm

BlockOS开发日志(番外一)实现准星的评论 (共 条)

分享到微博请遵守国家法律