您的位置:首页 > 移动开发 > Unity3D

unity实现切换渲染模式

2016-11-02 23:06 831 查看
在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成功。

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



原文章地址:http://www.cnblogs.com/jarvisniu/p/5504788.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 渲染模式