Unity 5标准着色器到传统着色器

时间:2015-11-13 16:28:05

标签: unity3d shader unity5

我有一个使用数百个3D模型的Unity 4.3项目。现在我们将它升级到Unity 5.它将所有着色器替换为标准,这使得它们看起来与我们之前的着色器看起来不同且更暗。为了获得相同的外观,我们需要使用他们拥有的旧版着色器替换标准着色器。

在Unity 5中,有没有办法确定材料在升级之前的遗留着色器?由于我们正在动态加载模型,因此我们不知道他们在Unity 4中使用了哪些着色器。有没有办法在Unity 5中以编程方式读取它,或者是否存在标准到旧版着色器的映射?

1 个答案:

答案 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...
    };

}

在红色立方体和具有地球纹理的球体上进行测试。脚本执行前的材料: bef1

在: af1

以前的游戏视图: bef2

后:

af2