【Unity】运用CommandBuffer实现发光特效

这篇具有很好参考价值的文章主要介绍了【Unity】运用CommandBuffer实现发光特效。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先看下效果:

【Unity】运用CommandBuffer实现发光特效

 我们想要实现以下效果:

  • 发光物体边缘模拟丁达尔效应,产生光芒。
  • 可以被其它物体遮挡。
  • 任意形状物体都可以产生以上效果。

首先确定实现的思路:

1、将发光物体单独绘制一遍,并计算在环境中的遮挡,剔除被遮挡的像素,保存绘制后的纹理。

2、将发光物体单独绘制后的纹理,添加模糊效果,并向外扩散。

3、将模糊处理后的纹理,与相机渲染的纹理进行叠加,形成最终的效果。

第一步:

如何将发光的物体单独绘制一遍并保存纹理?这时候就用到Unity中的CommandBuffer了。CommandBuffer可以简单理解为:创建一系列渲染指令,然后在某个阶段执行这些渲染指令。网上有很多相关的教程和案例,在这就不细说了。

我们用CommanBuffer将发光物体全都绘制一遍,然后渲染到一个RenderTexture上:

    /// <summary>
    /// 绘制需要有模糊效果的物体
    /// </summary>
    void DrawObjects()
    {
        drawObjsCmd = new CommandBuffer();
        drawObjsCmd.name = "绘制发光物体";
        //绘制到一个RenderTexture上
        drawObjsCmd.SetRenderTarget(colorTexture);
        drawObjsCmd.ClearRenderTarget(true, true, Color.clear);

        //绘制所有发光物体
        foreach (var item in renderers)
        {
            if (!item.enabled)
                continue;

            //设置材质球参数
            var colorMat = new Material(postRenderColor);
            colorMat.SetFloat("_Scale", item.scale);
            colorMat.SetColor("_Color", item.color);
            drawObjsCmd.DrawRenderer(item.meshRenderer, colorMat, 0, 0);
        }
        //执行CommandBuffer
        Graphics.ExecuteCommandBuffer(drawObjsCmd);
    }

postRenderColor这个shader,具有绘制纯色,并根据深度图计算遮挡关系的功能。

【Unity】运用CommandBuffer实现发光特效
单独绘制发光物体

第二步:模糊效果

关于模糊效果,我们一般采用高斯模糊,关于高斯模糊,本文也不多做细说,网上相关文章也很多,我们直接拿来用即可。但是需要注意的是,为了保证效果,我们可能会对纹理进行多次采样,这时就要注意性能和效果间的平衡。

模糊处理这步,我们单独用一个CommandBuffer进行处理:

/// <summary>
    /// 模糊效果
    /// </summary>
    private void AddGlowCommand()
    {
        blurCmd = new CommandBuffer();
        blurCmd.name = "模糊处理";
        //创建一个纹理,用于绘制模糊效果
        int temp = Shader.PropertyToID("_TempImage");
        blurCmd.GetTemporaryRT(temp, -1, -1, 0, FilterMode.Bilinear);

        float dir = 1;
        for (int i = 0; i < samplingIteration; i++)
        {
            //竖向采样一次
            blurCmd.SetGlobalVector("_Dir", new Vector4(0, dir, 0, 0));
            blurCmd.Blit(colorTexture, temp, blurMat);
            //横向采样一次
            blurCmd.SetGlobalVector("_Dir", new Vector4(dir, 0, 0, 0));
            blurCmd.Blit(temp, colorTexture, blurMat);
            //每次采样后,扩展一次模糊中的采样距离,这样效果会更好
            dir += glowAdd;
        }
        blurCmd.SetGlobalTexture("_AddTex", colorTexture);
        cam.AddCommandBuffer(CameraEvent.BeforeImageEffects, blurCmd);
    }
【Unity】运用CommandBuffer实现发光特效
模糊效果

第三步:叠加

到这里,就快大功告成了,只需通过shader的叠加算法,将相机渲染出的纹理和我们前面模糊处理后的纹理叠加即可:

//shader中的叠加算法
float4 blend(float4 main, float4 add)
			{
				float4 color = float4(0, 0, 0, 1);
				float l = max(max(main.r, main.g), main.b);
				color.r = main.r*(1 - add.a*saturate(main.r - add.a)) + add.r;
				color.g = main.g*(1 - add.a*saturate(main.g - add.a)) + add.g;
				color.b = main.b*(1 - add.a*saturate(main.b - add.a)) + add.b;
				return color;
			}

 这里我只用了我认为比较好的叠加算法,如果你有更好的算法的话,希望可以留言交流一下。

【Unity】运用CommandBuffer实现发光特效
处理前效果
【Unity】运用CommandBuffer实现发光特效
处理后效果

 最后,附上github链接:GitHub - liuyima/UnityGlow: 发光物体特效文章来源地址https://www.toymoban.com/news/detail-431333.html

到了这里,关于【Unity】运用CommandBuffer实现发光特效的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 17.CSS发光按钮悬停特效

    css

    2024年02月10日
    浏览(25)
  • 15.CSS发光按钮的悬停特效

    css

    2024年02月10日
    浏览(23)
  • 使用html+css制作一个发光立方体特效

    使用html+css制作一个发光立方体特效

    2024年03月14日
    浏览(58)
  • Unity 2D Spine 外发光实现思路

    前言 对于3D骨骼,要做外发光可以之间通过向法线方向延申来实现。 但是对于2D骨骼,各顶点的法线没有向3D骨骼那样拥有垂直于面的特性,那我们如何做2D骨骼的外发光效果呢? 理论基础 我们要知道,要实现外发光效果,首先得先实现外描边效果。对于2D图片的描边实现有

    2024年02月22日
    浏览(34)
  • Unity中URP下实现能量罩(外发光)

    2024年01月13日
    浏览(58)
  • [Unity] ShaderGraph实现Sprite图片描边/发光效果

    使用版本为:2022.3.10f1  [原始图]      [运行前]      [运行后] 更详细的实现逻辑及步骤参考CodeMonkey的视频: https://youtu.be/FvQFhkS90nI?si=zy6XRlqGnzIdQkqD OS:猴子老师,我永远的神!!! 目录 一、准备工作 二、偏移效果与颜色叠加 三、单侧描边与原理 四、另一侧与Sub管理 五、

    2024年01月20日
    浏览(36)
  • unity的CommandBuffer介绍

      大家好,我是阿赵。   之前介绍过使用PostProcessing来做屏幕后处理效果。我们不一定要用PostProcessing来做后处理效果。   PostProcessing功能强大,比如不同的layer控制不同的屏幕效果,比如可以使用PostProcessVolume的非全局效果达到某个范围内有过渡性的后处理效果。但如

    2024年02月05日
    浏览(23)
  • Unity烟花特效实现(附源码)

    朋友过生,不知道送什么礼物,就想着用自己所学知识做个特效当礼物吧,嘿。 主要参考了 这位up的视频 ,感谢 https://github.com/hahahappyboy/UnityProjects/tree/main/%E7%83%9F%E8%8A%B1(%E7%B2%92%E5%AD%90%E7%B3%BB%E7%BB%9F) 主要就是1个主烟花粒子系统带3个子粒子系统,这三个小的粒子系统分别是拖

    2024年02月08日
    浏览(42)
  • 【实现100个unity特效之7】unity 3d实现各种粒子效果

    直接调整为【Stretched Billboard拉伸/延伸渲染】 控制雨的大小 创建个材质 材质设置 挂载材质 设置延申效果 第一个叫做Speed Scale:通过比较每个粒子的速度,来去决定每个粒子拉伸/延伸的长度 而Length Scale:通过粒子的宽度,来决定粒子的长度 3d粒子大小随机化 颜色也可以设置随

    2024年01月19日
    浏览(43)
  • 实现窗户特效的Unity Shader解析

            本文将详细介绍一种使用Unity Shader实现窗户特效的方法。通过分析代码,我们将解释每个关键部分的作用,以及如何将其组合在一起以实现逼真的窗户效果。希望本文能为Shader编程初学者和Unity开发者提供一些有用的指导。   引言:         在游戏和虚拟现实

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包