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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM