【问题标题】:Unity 5 Standard shader to legacy shaderUnity 5 标准着色器到传统着色器
【发布时间】:2015-11-14 02:43:04
【问题描述】:

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

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

【问题讨论】:

    标签: unity3d shader unity5


    【解决方案1】:

    一种可能是读取着色器的名称,并尝试用旧的遗留着色器替换它,例如通过使用查找表。编译新的 Unity5 着色器对应于旧的 Unity4 传统着色器的列表。或者,您必须将一些纹理或值从新的 Unity“标准”着色器传输到您的旧着色器,例如检测到使用了法线贴图,您必须为此选择适当的传统着色器并重新分配着色器变量。示例脚本:

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

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

    之后:

    之前的游戏视图:

    之后:

    【讨论】:

    • 非常感谢您的详细回答。我有 2 个问题。 1.如何找到要放入上述shadertable的映射。我认为现在有大约 20 个或更多的传统着色器,所有这些着色器现在都使用标准着色器。从哪里可以找到它们中 ech 的新标准着色器名称,例如 diifuse 透明、顶点照明等...
    • 2.导入模型时,我尝试在 OnAssignMaterialModel 函数中读取 AssetPostprocessor 类中的旧着色器,但它显示的是新着色器而不是旧着色器。要像您一样获得 oldShaderName,我需要在哪里设置此脚本?谢谢
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多