Unity 自定义Post Processing 后期效果

2024-06-13 15:08

本文主要是介绍Unity 自定义Post Processing 后期效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

测试环境

Unity2018.4.6

Post Processing2.1.7

实现后期效果需要三个文件 ,以GrayScale举例:

 

1.GrayScaleEditor.cs

    此文件主要做面板上控制属性显示

    

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;namespace UnityEditor.Rendering.PostProcessing
{[PostProcessEditor(typeof(GrayScale))]public sealed class GrayScaleEditor : PostProcessEffectEditor<GrayScale>{SerializedParameterOverride m_Blend;public override void OnEnable(){m_Blend = FindParameterOverride(x => x.m_Blend);}public override void OnInspectorGUI(){EditorUtilities.DrawHeaderLabel("GrayScale");PropertyField(m_Blend);}}
}

 

 

2.GrayScale.cs

  GrayScale类需要继承 PostProcessEffectSettings,这里主要是提供给用户的调参属性结构。

  GrayScaleRenderer类继承PostProcessEffectRenderer<GrayScale>,重载Render方法,此方法可以通过CommandBuff做效果。

using System;
using UnityEngine.Serialization;
namespace UnityEngine.Rendering.PostProcessing
{[Serializable][PostProcess(typeof(GrayScaleRenderer), UnityEngine.Rendering.PostProcessing.PostProcessEvent.AfterStack, "Unity/GrayScale", true)]public class GrayScale : PostProcessEffectSettings{[Range(0f, 1f), Tooltip("Grayscale effect intensity.")]public FloatParameter m_Blend = new FloatParameter { value = 0.5f };public override bool IsEnabledAndSupported(PostProcessRenderContext context){return enabled.value&& m_Blend.value > 0f;}}#if UNITY_2017_1_OR_NEWER[UnityEngine.Scripting.Preserve]
#endifinternal sealed class GrayScaleRenderer : PostProcessEffectRenderer<GrayScale>{public override void Render(PostProcessRenderContext context){var sheet = context.propertySheets.Get(Shader.Find("Test/Grayscale"));sheet.properties.SetFloat("_Blend", settings.m_Blend);context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);}}
}

 

注意点:

MaterialPropertyBlock(MPB) 

MaterialPropertyBlock is used by Graphics.DrawMesh and Renderer.SetPropertyBlock. Use it in situations where you want to draw multiple objects with the same material, but slightly different properties. For example, if you want to slightly change the color of each mesh drawn. Changing the render state is not supported.

 

  这是文档的一段说明,Unity建议用MPB的API去替换掉传统的Material.setXXX,有用户测试过,提升还是蛮大的。猜测Unity应该是对材质管理和图形API底层Shader赋值的结构上进行了优化,降低了不必要的查找,拷贝等。

 

3.GrayScale.shader

   shader需要使用HLSL来编写,必须引入文件 StdLib.hlsl

Shader "Test/Grayscale"
{HLSLINCLUDE#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);float _Blend;float4 Frag(VaryingsDefault i) : SV_Target{float4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);float luminance = dot(color.rgb, float3(0.2126729, 0.7151522, 0.0721750));color.rgb = lerp(color.rgb, luminance.xxx, _Blend.xxx);return color;}ENDHLSLSubShader{Cull Off ZWrite Off ZTest AlwaysPass{HLSLPROGRAM#pragma vertex VertDefault#pragma fragment FragENDHLSL}}
}

 

这篇关于Unity 自定义Post Processing 后期效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057649

相关文章

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细