记一次Amplify Shader Editor入门_Unity官方Shader基础属性说明之不得不说ZWrite,Ztest

Posted avi9111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次Amplify Shader Editor入门_Unity官方Shader基础属性说明之不得不说ZWrite,Ztest相关的知识,希望对你有一定的参考价值。

目录

ASE断开连接后,不解

放弃一:官方的Interface Shader的含义之理解

Emission

Opacity Mask

放弃二:ZWrite和ZTest

Clip方法


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 节点文档地址

Unity Amplify Shader Editor-编辑器扩展开发Canvas框架

unity再记一次shader渲染性能工具