最近正在做unity项目从2018升级到unity2021版本,某个shader报Shader warnig in "xxxx.shader":Both vertex and fragment programs must be present in a CGPROGRAM. Excluding it from compilation.错误,第一反应是肯定是Shader本省错误。肉眼看去并没有发现有什么错误,也与2018的版本Shader进行比较,并无差异
奇怪的现象,总是有一些不为人知的隐藏,但往往又无法解释,就此开始一一尝试:
1、怀疑语法错误
因为我的shader有多个pass,我就一一屏蔽,发现情况依旧,结果失败
2、检查 CGPROGRAM,ENDCG 是否拼写 错误
仔仔细细检查,结果失败
3、是否用到特殊Shader语法特性
shader内容相对简单,并没有特殊语义的地方
4、神奇时刻,用subline text 打开
先前看shader文件都是通过vs打开,阴差阳错我想看下类似的shader与该shader文件有什么不同,通过subline text文本编辑器软件打开该文件,神奇的情况发现了,在#pragma vertex vert 语句后面竟然有一个 特殊转义字符(0x0a)Ascii换行符,并发现其他语句也有,尝试删除该字符
既然成功了,直接破案。
结论:
原来的shader是Ascii编码,而 subline Text是utf8编码,所以subline Text能看出来,为啥VS打开时候看不到呢,是因为vs是自适应文件的编码格式,所以用它打开无法看到(0x0a)Ascii换行符