记一次Amplify Shader Editor入门_Unity官方Shader基础属性说明之不得不说ZWrite,Ztest
Posted avi9111
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次Amplify Shader Editor入门_Unity官方Shader基础属性说明之不得不说ZWrite,Ztest相关的知识,希望对你有一定的参考价值。
目录
Amplify Shader Editor; 2018~2019年Unity最佳第三方Shader编辑工具,简称ASE
ASE断开连接后,不解
按照教科书做了,没效果,别人都是牛人,一到自己这,只能放弃.
放弃一:官方的Interface Shader的含义之理解
abledo,normal那些就不用说了,小学生都会
Emission
Opacity Mask
在说这两个问题时,不得先说明ZWrite和ZTest
放弃二:ZWrite和ZTest
一般人的理解画画,是先画底框,再画背景,再画山,然后是房子,这完成了一个完整画
但Photoshop的渲染,不知道从那个版本开始是从Canvas底往上的渲染顺序
Unity一般渲染,也是是先从靠近摄像机对象开始绘制,然后是远离摄像机的对象
Unity一遍渲染,一边通过ZTest判断是否需要丢弃该像素,被遮罩的(Greater)则丢弃,所以默认是Less的,Less通过的才可以被绘制,符合一般人理解
ZWrite 就2个选项,ON/Off
而ZTester很多选项,咋看挺吓人的,但只要以科学的态度分析一下,这些分类选项来说无非就是:大于和小于
多次混淆,学习多次,在实战中锻炼后发现真理如下:
要是ZTester Greater,则只有框内的能被显示,因为Less(框外)的部分被剔除掉了
要是ZTester Always,和off等价(Unity官方隐性这么干,官方就尿性,忍了吧,也能解释了为什么ASE没有ZTest off的选项)
- 所以就是全显示,场景中100个物件,你100个全显示me》》???
要是ZTester Less,正常的前绘制,后被覆盖则丢弃;
- TMD不选它还能选什么
总结:
Unity官方好像很贴心地给了你选项;其他引擎或者也是这么干的;大神的技术书也是这么说的
但其实你懂了ZWrtie和ZTest,你也是什么都不能干
华山只有一条道,不要钻牛角尖,给不起钱坐缆车,就没什么捷径了,你只能慢慢爬
a
SubShader
{
Tags{ "RenderType" = "Custom" "Queue" = "Geometry+0" }
Cull Back
ZWrite On
ZTest Greater
b,ZTest选什么都不重要,除非还有1个c在前面,而b在a前,必然先绘制,主要是a的绘制的判断大小
SubShader
{
Tags{ "RenderType" = "Custom" "Queue" = "Geometry+0" }
Cull Back
ZWrite On
ZTest Less
result.
a. Less;只要b不选off或者always;而b要是这么选,是没有任何实际应用意义的;
SubShader
{
Tags{ "RenderType" = "Custom" "Queue" = "Geometry+0" }
Cull Back
ZWrite On
ZTest Less
result.
Clip方法
clip是一个神秘的方法,祖传的方法,这么多年过去了
人们总是在谈论如何使用clip(),在争论到底参数是float还是color
但没有一个人能说出这个方法是怎么定义的,这到底是怎么样一个SB方法
连UnpackNormal都能随便找到源码
inline fixed3 UnpackNormal(fixed4 packednormal)
{
#if defined(UNITY_NO_DXT5nm)
return packednormal.xyz * 2 - 1;
#else
return UnpackNormalmapRGorAG(packednormal);
#endif
}
那么到底clip是什么
Unity就是这么神秘
我理解的错了,写第二次,这还不一定对,请自行斟酌
clip(a)
if(a<0)
discard;
假如逻辑如上,那么大多数情况,shader里面的数值是范围【0,1】,
根本不会小于0,有木有,所以,本来这个方法根本用不上的
然后,出了一个天才,一般是这么写:
clip(a-0.5)
if(a-0.5<0)
discard;
不能说这么用的人不聪明,不是天才,但大多数人这么用,又有人更天才,又多封装一层,最后,形成今天的状况,难免套娃
这也就是把标准尺从0,提到了0.5,虽然没有完全反转逻辑,<0.5的,或者透明度低的即剔除;1==Opacity == 保留
我们也一直这么用下来了,有点约定俗成,却没人去责怪创造clip这个方法的Unity的sb
作为通用的Unity引擎开发人员,也有他的难处,就是你写clip(空),因为==0,所以不会剔除任何东西,有个保护,这也是程序员的修养;
要是你写clip这个原始方法,为了省事,或者没深思熟虑,写了<=0即剔除;那就更灾难了
本来只要多一点点思考,或者多一点点执行力,在unity内部推行更有效的api;就不会有那么多误解和难堪了
那么问题来了
对于边界值,要是刚好透明度==0.5,是显示呢还是不显示呢?
ASE的Blend Mode改成 Masked
又TM一个隐藏属性,你必须对blend mode, Alpha Test等了如指掌
用上Ok连线后,会多了一行Clip代码
Mask Clip Value 也就是Opacity Mask(ASE内部)
以上是关于记一次Amplify Shader Editor入门_Unity官方Shader基础属性说明之不得不说ZWrite,Ztest的主要内容,如果未能解决你的问题,请参考以下文章
Unity记一次Amplify Shader Editor入门渲染案例中文解释——UV流动动画
Unity记一次Amplify Shader Editor入门渲染——ZTest,ZWrite,Cull Mode
Amplify Shader Editor如何整体移动多个节点
Shader Graph 和 Amplify Shader Editor 节点文档地址