zoukankan      html  css  js  c++  java
  • Unity在运行时(代码中)设置材质的渲染模式(RenderingMode)

    Unity中,有些少数情况下我们需要用代码来创建材质。比如说在材质非常多,而仅仅是纹理不一样的时候。

    而用代码创建的材质是没有对应的资源文件的,我们也就无法使用Inspector来设置它的Rendering Mode。

    关于Rendering Mode,许我稍作介绍:

    材质(Material)的属性检视面板(Inspector)里的第一项为渲染模式(RenderingMode)

    渲染模式总共有四种:

    渲染模式

    意思

    适用对象举例

    说明

    Opaque

    不透明

    石头

    适用于所有的不透明的物体

    Cutout

    镂空

    破布

    透明度不是0%就是100%,不存在半透明的区域。

    Fade

    隐现

    物体隐去

    Transparent的区别为高光反射会随着透明度而消失。

    Transparent

    透明

    玻璃

    适用于像彩色玻璃一样的半透明物体,高光反射不会随透明而消失。

    有时候我们需要在程序代码(Script)中设置材质的渲染模式,这时候我们该怎么做呢?这时候可以通过添加以下代码来实现。

    public enum RenderingMode 
    {
        Opaque,
        Cutout,
        Fade,
        Transparent,
    }
    
    public static void SetMaterialRenderingMode (Material material, RenderingMode renderingMode)
    {
        switch (renderingMode) {
        case RenderingMode.Opaque:
            material.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
            material.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
            material.SetInt ("_ZWrite", 1);
            material.DisableKeyword ("_ALPHATEST_ON");
            material.DisableKeyword ("_ALPHABLEND_ON");
            material.DisableKeyword ("_ALPHAPREMULTIPLY_ON");
            material.renderQueue = -1;
            break;
        case RenderingMode.Cutout:
            material.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
            material.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
            material.SetInt ("_ZWrite", 1);
            material.EnableKeyword ("_ALPHATEST_ON");
            material.DisableKeyword ("_ALPHABLEND_ON");
            material.DisableKeyword ("_ALPHAPREMULTIPLY_ON");
            material.renderQueue = 2450;
            break;
        case RenderingMode.Fade:
            material.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
            material.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
            material.SetInt ("_ZWrite", 0);
            material.DisableKeyword ("_ALPHATEST_ON");
            material.EnableKeyword ("_ALPHABLEND_ON");
            material.DisableKeyword ("_ALPHAPREMULTIPLY_ON");
            material.renderQueue = 3000;
            break;
        case RenderingMode.Transparent:
            material.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
            material.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
            material.SetInt ("_ZWrite", 0);
            material.DisableKeyword ("_ALPHATEST_ON");
            material.DisableKeyword ("_ALPHABLEND_ON");
            material.EnableKeyword ("_ALPHAPREMULTIPLY_ON");
            material.renderQueue = 3000;
            break;
        }
    }

    使用方法:

    void Start () {
        // 设置材质的颜色为半透明的颜色才能看到效果,如果材质有贴图,那么贴图也必须是半透明的
        GetComponent<MeshRenderer> ().material.color = new Color (1, 0, 0, 0.5f);
        SetMaterialRenderingMode (GetComponent<MeshRenderer> ().material, RenderingMode.Transparent);
    }

    注意:测试前先在目标物体后放置一个其他物体,如果未添加代码前不可以看到后面物体,而添加之后可以了,那么就表示此代码设置RenderingMode成功。

    成功和不成功的结果是这样的:

    End

  • 相关阅读:
    amq笔记:记一个关于PooledConnectionFactory的问题
    ganglia笔记:rrd数据库
    ganglia笔记:rrds目录
    golang笔记:unsupported driver -> Scan pair: <nil> -> *string
    golang笔记:cookie
    golang笔记:net/smtp
    spring笔记
    Qt坑点汇总
    QT自定义控件系列(二) --- Loading加载动画控件
    Qt自定义控件系列(一) --- 圆形进度条
  • 原文地址:https://www.cnblogs.com/jarvisniu/p/5504788.html
Copyright © 2011-2022 走看看