热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大数据中一种模型淡入淡出时透明面重叠问题的解决方案

大数据中一种模型淡入淡出时透明面重叠问题的解决方案,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面

大数据中一种模型淡入淡出时透明面重叠问题的解决方案,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

角色死亡时需要一个渐消效果,最普通的想法就是转成透明物体设置alpha淡化,然后就会出现这样的情况。

大数据中一种模型淡入淡出时透明面重叠问题的解决方案

由于模型有分层,会露出衣服下面的部分,而那些部分往往是有缺失的,就算只显示1秒也非常出戏。而想解决这个问题也简单,在前面新增一个PASS仅绘制深度,就能过滤掉内部的模型了。这也是魔兽世界等游戏处理潜行和幽灵人物的方法。

Pass
{
	Tags{ "RenderType"="Transparent" "Queue"="Transparent" }  
	ColorMask 0
}

大数据中一种模型淡入淡出时透明面重叠问题的解决方案

这个方案的是完美的吗?其实并不是。首先这样做会导致模型以透明方式绘制,无法遮挡地面导致overdraw,但这也算小事。问题在于,这种方法只能针对单Renderer物体,有多个Renderer的时候它还是会重叠绘制。如果你希望不重叠,可以将写深度的PASS的RenderQueue向前设置,但这样做的话,所有被这个物体遮挡的透明物体又都无法显示了(我的世界的玻璃就是这样一种状况),想要两全其美比较麻烦。合并模型是能解决问题,但是材质不同怎么合?分部位换装怎么可能只用一张贴图?

更何况,毕竟这是把不透明物体变成了透明物体,这两者在渲染处理上相差巨大,并不总能保证转换自然(透明度设置为1时应该保证和之前不透明时的显示一致)。而到了延迟渲染管线后,由于透明物体机理上难以接受光照,只能单独处理,或者代价巨大,就彻底无法使用了。

所以现世代游戏不少都是用的下面这种做法。

大数据中一种模型淡入淡出时透明面重叠问题的解决方案

某一帧

大数据中一种模型淡入淡出时透明面重叠问题的解决方案

实际上并没有任何透明像素,仅仅是通过clip让前方的像素和后方的像素交替显示,做出一种“看上去是半透”的效果。这样实质上还是不透明物体渲染,上面说的那些问题就都不存在了。

以下是Shader

Shader "Unlit/AlphaGrid"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_Alpha ("Alpha", Range(0,1)) = 0.1
		_AlphaGridTex ("Alpha Grid Texture", 2D) = "white" {}
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		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
			{
				float4 vertex : SV_POSITION; 
				float2 uv : TEXCOORD0;
				float4 screenUv : TEXCOORD1;
				UNITY_FOG_COORDS(1)
			};
			
			sampler2D _MainTex;
			float4 _MainTex_ST;
			sampler2D _AlphaGridTex;
			//float4 _AlphaGridTex_ST;
			float _Alpha;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				float4 screenPos = ComputeScreenPos(o.vertex);
				screenPos.xy *= _ScreenParams.xy / 8;//此处不能先除w,会导致插值精度不够
				o.screenUv = screenPos;
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				// sample the texture
				fixed4 col = tex2D(_MainTex, i.uv);
				float gridAlpha = tex2Dproj(_AlphaGridTex, i.screenUv).a;
				// apply fog
				UNITY_APPLY_FOG(i.fogCoord, col);
				clip(_Alpha - gridAlpha);
				return col;
			}
			ENDCG
		}
	}
}

注意_AlphaGridTex应该设成全局纹理,我这样写只是为了不写cs代码。

纹理本身是这样的一张8x8的alpha8图片,记录了每个8x8屏幕像素的过滤顺序。

大数据中一种模型淡入淡出时透明面重叠问题的解决方案

放大:

大数据中一种模型淡入淡出时透明面重叠问题的解决方案

本来想用算法生成,最后还是手绘方便……64个点而已。

当然,这样做虽然不用额外PASS,但是毕竟是AlphaTest的做法,比不透明物体渲染还是会慢的,顶点上也多了一些计算压力,但也就仅此而已了。

(目前手游上,非PowerPR芯片使用discard会导致Early-Z失效,AlphaTest的物体即使被其他物体遮挡也会照样绘制,导致浪费OverDraw,但那也是它被遮挡的时候才会发生的情况,这种情况恐怕并不常见,而且即使再差也还是比alphablend强。

而PowerPR芯片则是另外一种情况,虽然不会导致OverDraw浪费,但是绘制本身变慢了,假如人物frag阶段比地面复杂,半透程度也比较高的话,确实会有一定的性能问题。所以这并非优化,而是一种解决问题的办法,至于到底是变快还是变慢还要看具体的情况)

当然,这种方法并不能用来做常态的人物半透,久了是必然糊弄不了的,只能用来做渐入渐消。(虽然有游戏确实在这么搞,诸如FF14,他们也是没其他的选择吧)

效果确实也不能算好,只是特殊情况的特殊选择。

但多个选择总是好的。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程笔记行业资讯频道,感谢您对编程笔记的支持。


推荐阅读
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
author-avatar
KING逊咖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有