Unity urp渲染管线下,动态修改材质球surfaceType

在项目中遇到了需要代码动态修改材质球的surfaceType,使其动态切换是否透明的需求。

urp渲染管线下,动态修改材质球的surfaceType,查了大部分帖子,都有一些瑕疵,可能会造成透明后阴影投射有问题。

其次在webgl平台上,可能还会造成透明物体仍会发生镜面反射的问题,进而出现模型曝光,与编辑器中展示效果差别过大

下面的方法解决了这类问题

cs 复制代码
 private void setTransparent(Material mat, bool isTransparent)
    {
        if (isTransparent)
        {
            //修改surfacetype为Transparent
            mat.SetFloat("_Surface", 1.0f);

            mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
            mat.SetInt("_DstBlend",(int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
            mat.SetInt("_ZWrite", 0);

            mat.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
            mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
            mat.SetShaderPassEnabled("ShadowCaster", false);
        }
        else
        {
            mat.SetFloat("_Surface", 0.0f);
            mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
            mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
            mat.SetInt("_ZWrite", 1);

            mat.renderQueue = -1;
            mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
            mat.SetShaderPassEnabled("ShadowCaster", true);
            
        }
    }
相关推荐
BuHuaX19 小时前
U3D抖微小游戏开发流程 (一)
unity·c#·游戏引擎·游戏策划
_ZHOURUI_H_1 天前
Unity MyFramework 用法说明(二十三):使用 PrefabPoolManager 复用预设实例
unity·游戏引擎·游戏开发·游戏ui·手游开发
冰凌糕1 天前
Unity3D Shader 法线与基础光照
unity
新手unity自用笔记1 天前
unity网络基础_1
网络·unity·游戏引擎
谢斯2 天前
[vscode] 使用unity打开vscode的取消.csproj的显示
ide·vscode·unity
魔术师Dix2 天前
StartGame:Unity TDD 外部工程指南
学习·游戏·unity·c#·测试驱动开发
hsw8157739433 天前
第10章 软件架构的演化和维护 — 系统架构设计师
unity·系统架构·游戏引擎
tealcwu3 天前
【尝鲜】Unity 6.7alpha版本测试
unity·游戏引擎