我有一个使用数百个3D模型的Unity 4.3项目。现在我们将它升级到Unity 5.它将所有着色器替换为标准,这使得它们看起来与我们之前的着色器看起来不同且更暗。为了获得相同的外观,我们需要使用他们拥有的旧版着色器替换标准着色器。
在Unity 5中,有没有办法确定材料在升级之前的遗留着色器?由于我们正在动态加载模型,因此我们不知道他们在Unity 4中使用了哪些着色器。有没有办法在Unity 5中以编程方式读取它,或者是否存在标准到旧版着色器的映射?
答案 0 :(得分:2)
可能是读取着色器的名称,并尝试将其替换为旧的旧着色器,例如通过使用查找表。编译新的Unity5着色器与旧的Unity4旧着色器对应的列表。或者,您必须将一些纹理或值从新的Unity“标准”着色器传输到您的旧着色器,如果您需要检测到,使用了法线贴图,您必须为此选择apriopate遗留着色器并重新指定着色器变量。示例脚本:
using UnityEngine;
using System.Collections.Generic;
[RequireComponent(typeof(Renderer))]
public class ChangeToLegacyShader : MonoBehaviour {
// At startup..
void Start () {
var oldShaderName = GetComponent<Renderer>().material.shader.name;
//try to search for the shader name in our lookup table
if (shaderTable.ContainsKey(oldShaderName))
{
//Replace the shader
var newShader = Shader.Find(shaderTable[oldShaderName]);
GetComponent<Renderer>().material.shader = newShader;
//Additional stuff: Set new paramers, modifiy textures, correct shader variables,...
}
else
{
Debug.LogWarning("Couldn't find replacement for shader: " + oldShaderName);
}
//Remove this script after we're done.
Destroy(this);
}
public static Dictionary<string, string> shaderTable = new Dictionary<string, string>()
{
{"Standard", "Legacy Shaders/Diffuse"}, //map standard to the diffuse shader, good enough for this small example
{"Standard (Specular Setup)", "Legacy Shaders/Specular"}
//more...
};
}
在红色立方体和具有地球纹理的球体上进行测试。脚本执行前的材料:
后: