在项目实践中,我的模型做了两套uv,我需要使用standardShader的secondary maps,因此在面板上选择uv1,这样Detail Albedo x 2使用的是第二套uv。
在烘培完光照贴图之后,运行项目,发现贴图发生了改变。把物体的static选项取消,再运行,贴图正常。这意味着第二套uv和光照贴图不让同时使用了吗?(经过反复测试,如果场景中只有一个物体,不会出这个错误,一旦有一个以上物体,就会出现错误。)
通过不断试验和在论坛中查找,得出以下经验。
一、
这是unity工作人员,在论坛中给出的关于使用uv的说明图表。unity一共支持4套uv,在shader编程中,分别叫UV0, UV1, UV2, UV3,而在c#编程中分别叫UV, UV2, UV3, UV4。由于我是要对shader进行修改,所以使用shader编程中的命名。按照图表中的解释,UV0用于主纹理, UV1用于光照贴图, UV2用于实时动态光照, UV3可进行自定义。
二、如果在3d模型中只做了一套uv,将模型导入unity的时候,在导入设置中勾选Generate Lightmap UVs, unity会自动为我们生成用于光照贴图的uv1,和用于动态光照的uv2。
三、由此得知,我之前的错误结果是因为使用了光照贴图的那套uv1进行纹理贴图造成的。我应该使用的是唯一可以自定义的uv3。使用方法,给物体做3套uv,重写UnityStandardInput.cginc。打开这个文件,找到顶点输入结构体,
里面只有包含了3套uv,自己在结构体内加入 float2 uv3 :TEXCOORD3;
然后在使用的时候,把使用uv1改为使用uv3,我的情况如下,
这样在UV Set选uv1后,Detail Albedo x 2就会使用uv3了。
四、经过反复的测试,发现一些现象,并不能解释,也没有查出原因。如果模型自带两套uv,即使修改了UnityStandardInput.cginc也得不到正确结果,必须要有3套uv。奇怪的是,在一个场景中,只要有任何一个物体带了三套uv,其他物体都只有两套uv,所有的物体都能得到正确的结果。