unity怎么实现半透明物体的描边和投影

这篇文章主要介绍了unity怎么实现半透明物体的描边和投影的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇unity怎么实现半透明物体的描边和投影文章都会有所收获,下面我们一起来看看吧。

半透描边大概就三种方案,1.按透明绘制但是写入深度,2.用模板缓存代替深度,3.当不透明物体渲染并用GrabPass来模拟透明。我这里用的是最简单的第一种。

和头发类似,先绘制背面,再绘制正面,然后再扩边绘制背面的描边,3个PASS,需要保证模型的内面的深度更高。封闭物体都具有这个性质。

Tags{ "RenderType" = "Transparent"  "Queue" = "Transparent" }
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB
Cull Front

CGPROGRAM
#pragma vertex vert
#pragma fragment frag

ENDCG
}

Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB
Cull Back

CGPROGRAM
#pragma vertex vert
#pragma fragment frag

ENDCG
}

Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB
Cull Front

CGPROGRAM
#pragma vertex vert_line
#pragma fragment frag_line

ENDCG
}

用普通的透明shader和backface扩边替换vert,frag,vert_line,frag_line就可以得到这个效果,因为具体实现各人的都不同,就不写出来了。

会出现的瑕疵有:

1.两个透明物体并交叉包含的时候会互相遮挡,而且当透明排序变化的时候会跳变

unity怎么实现半透明物体的描边和投影

透明物体的固有问题,没什么好办法,别让这种情况出现就好。

2.粒子处于模型的前方,而且发射出的粒子进入球内的时候会被遮挡。而如果粒子处于模型后方,无论如何都不会被遮挡。

unity怎么实现半透明物体的描边和投影

这其实也是半透明自己的问题。如果在意半透和非半透交叉产生的交线,可以开启软粒子回避(其实球和Cude的交线瑕疵也能这样回避)


半透阴影其实可行的就网点这种,其他的诸如给shadowmap加透明通道,都需要额外增加成本,而且难以处理多层叠加的问题(两层半透之间的物体的阴影接收也是需要处理的),真正完美的方案需要把shadowmap存UAV里实现多层shadowmap(还要带透明度),这可算了吧。

网点半透需要修改ShadowCast,做法是给原Shader增加一个LightMode标记为ShadowCaster的Pass,并重新定义绘制逻辑。

Pass{
Tags {"LightMode" = "ShadowCaster"}
Cull Off
CGPROGRAM
#pragma vertex vert_shadow
#pragma fragment frag_shadow
#pragma multi_compile_shadowcaster
ENDCG
}

绘制阴影的时候需要根据原图的透明度,输出下图这样的网点图案来模拟透明效果(为了方便观察故意把网点放大了)

unity怎么实现半透明物体的描边和投影

unity怎么实现半透明物体的描边和投影

unity怎么实现半透明物体的描边和投影

网点的生成没有使用网点纹理,而使用了一个数值计算的结果:

void transparencyClip(float alpha, float2 screenPos)
{
// Screen-door transparency: Discard pixel if below threshold.
float4x4 thresholdMatrix =
{ 1.0 / 17.0,  9.0 / 17.0,  3.0 / 17.0, 11.0 / 17.0,
 13.0 / 17.0,  5.0 / 17.0, 15.0 / 17.0,  7.0 / 17.0,
  4.0 / 17.0, 12.0 / 17.0,  2.0 / 17.0, 10.0 / 17.0,
 16.0 / 17.0,  8.0 / 17.0, 14.0 / 17.0,  6.0 / 17.0
};
float4x4 _RowAccess = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };
clip(alpha - thresholdMatrix[fmod(screenPos.x, 4)] * _RowAccess[fmod(screenPos.y, 4)]);
}

数值计算一般比用纹理采样要快。

原模型加入纹理后如下图

unity怎么实现半透明物体的描边和投影

采样的瑕疵很难避免,所以需要开启软阴影。

unity怎么实现半透明物体的描边和投影

使用较低的阴影质量时的情况:

unity怎么实现半透明物体的描边和投影

瑕疵基本可以接受,但在镜头移动的时候会产生一定的抖动现象,因此最好还是保持较高的精度。

而描边本身的阴影……因为ShadowCast只能存在一个。如果想生成这个可能只能复制一个单独的描边材质了,这个就算了吧。

需要注意的是,绘制阴影的时候需要严格对齐像素,所以需要获得shadowmap纹理的具体大小,而_ScreenParams那一系列函数是无效的。即使定下某个固定缩放数值,如果使用了层级阴影,切换到不同级别的时候也无法统一。

这里获取具体的屏幕坐标用了VPOS,具体写法可查看代码:

//shadowCast
struct v2f_shadow
{
float2 uv : TEXCOORD2;
};

void transparencyClip(float alpha, float2 screenPos)
{
// Screen-door transparency: Discard pixel if below threshold.
float4x4 thresholdMatrix =
{ 1.0 / 17.0,  9.0 / 17.0,  3.0 / 17.0, 11.0 / 17.0,
13.0 / 17.0,  5.0 / 17.0, 15.0 / 17.0,  7.0 / 17.0,
4.0 / 17.0, 12.0 / 17.0,  2.0 / 17.0, 10.0 / 17.0,
16.0 / 17.0,  8.0 / 17.0, 14.0 / 17.0,  6.0 / 17.0
};
float4x4 _RowAccess = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };
clip(alpha - thresholdMatrix[fmod(screenPos.x, 4)] * _RowAccess[fmod(screenPos.y, 4)]);
}
v2f_shadow vert_shadow(appdata_base v,out float4 outpos : SV_POSITION)
{
v2f_shadow o;
TRANSFER_SHADOW_CASTER_NOPOS(o, outpos)
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
float4 frag_shadow(v2f_shadow i, UNITY_VPOS_TYPE screenPos : VPOS) :SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv) * _Color;
transparencyClip(col.a,screenPos.xy);
SHADOW_CASTER_FRAGMENT(i)
}

关于“unity怎么实现半透明物体的描边和投影”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“unity怎么实现半透明物体的描边和投影”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程之家行业资讯频道。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...