最近正在做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换行符

在将Unity项目从2018版本升级到2021版本过程中,遇到Shader警告,提示顶点和片段程序都必须存在。经过一系列排查,包括检查语法、CGPROGRAM和ENDCG拼写、特殊Shader语法,最终发现是Shader文件中存在不可见的ASCII换行符(0x0a)。使用Sublime Text打开文件时,发现了这些特殊字符并删除后,问题得到解决。原来是ASCII编码与UTF8编码的差异导致的隐藏问题。
487

被折叠的 条评论
为什么被折叠?



