Unity3D+Post Processing Stack V2自定义后处理效果研究
背景
众所周知,Unity3D支持自定义后处理效果,实现过程有三步:
- 添加着色器,在着色器里书写后处理代码;
- 添加材质,把材质和着色器绑定;
- 给相机添加脚本,重写其OnRenderImage方法,将材质传入Graphics.Blit方法中。
但是在做最近的一个项目时,我使用了Unity3D的官方后处理插件Post Processing Stack V2(以下简称PPV2)来简化辉光、环境光遮蔽这类后处理效果的使用。但之后我又需要自定义一些后处理效果,此时就出现了问题。我发现我的OnRenderImage方法没有正常地接收到渲染帧经过插件处理后的纹理,而是接收到一个纯黑纹理,最后输出的也是纯黑,使得我的后处理效果无法正常工作,网上也找不到实际原因,可能和渲染管线的不同有关。为了解决这个问题,必须基于PPV2自定义一个效果,然后在其他代码中操作这个效果里的参数,由PPV2来执行我们的后处理效果。这个国内国外的教程都非常少,我主要参考了PPV2的官方文档,在这里给出。
代码
着色器
Shader "Hidden/Custom/Blend" {
HLSLINCLUDE
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"
TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
TEXTURE2D_SAMPLER2D(_DesTex, sampler_DesTex);
float _Alpha;
float4 Frag(VaryingsDefault i) : SV_Target {
float4 col1 = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
float4 col2 = SAMPLE_TEXTURE2D(_DesTex, sampler_DesTex, i.texcoord);
float4 col = lerp(col2, col1, _Alpha);
return col;
}
ENDHLSL
SubShader {
Cull Off ZWrite Off ZTest Always
Pass {
HLSLPROGRAM
#pragma vertex VertDefault
#pragma fragment Frag
ENDHLSL
}
}
}
基本和文档中的一致,只是修改了片元着色器函数里的代码,实现将两张纹理进行混合的过程,另外由于这个文档比较新,实例的Shader语法好像和以前的CG语言不太一样,不知道是不是换成了HLSL。
效果自定义
using System;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
[Serializable]
[PostProcess(typeof(BlendRenderer), PostProcessEvent.AfterStack, "Custom/Blend")]
public sealed class Blend : PostProcessEffectSettings {
public TextureParameter DesTex = new TextureParameter();
public FloatParameter Alpha = new FloatParameter();
}
public sealed class BlendRenderer : PostProcessEffectRenderer<Blend>
{
public override void Render(PostProcessRenderContext context) {
var sheet = context.propertySheets.Get(Shader.Find("Hidden/Custom/Blend"));
sheet.properties.SetTexture("_DesTex", settings.DesTex);
sheet.properties.SetFloat("_Alpha", settings.Alpha);
context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
}
}
这里定义了两个类,一个是设置类,提供了后处理效果所需的各种属性,其中支持的属性类型可以在项目下Packages/Post Processing/PostProcessing/Runtime/ParameterOverride.cs里找到,对应的基础类型有int、float、color、vector2、vector3、vector4、spline和texture。第二个类用来重写后处理方法,一般在这里指定要用的shader和给shader里的变量赋值。
修改效果参数
void Start() {
m_Blend = ScriptableObject.CreateInstance<Blend>();
m_Blend.enabled.Override(true);
m_Blend.Alpha.Override(1f);
m_Blend.DesTex.Override(Texture2D.blackTexture);
m_Volume = PostProcessManager.instance.QuickVolume(8, 100f, m_Blend);
// 8是后处理所在的层
}
这一段是初始化,先创建后处理效果,然后将其加入到后处理体积中。初始化后处理效果参数用Override方法,注意QuickVolume方法的第一个参数非常重要,它对应在PostProcessing Layer组件里填写的层的编号。
m_Blend.DesTex.value = tex; // tex -> Texture2D
m_Blend.Alpha.value = Alpha; // Alpha -> float
平常赋值直接修改属性名的value属性。
private void OnDestroy() {
RuntimeUtilities.DestroyVolume(m_Volume, true, true);
}
注意在对象被销毁时要将创建的临时后处理体积销毁。如果没有这一段,更换场景时后处理会继续工作,不是我们想要的效果。
总结
Unity3D+Post Processing Stack V2自定义后处理效果其实也是只有三步,就是编写后处理着色器、编写后处理效果类、编写操作后处理参数类。主要还是国内外的教程没有与时俱进导致资料查找困难,希望更多的新教程能不断涌现,方便开发者的学习。
Unity3D+Post Processing Stack V2自定义后处理效果研究的更多相关文章
- Android项目实战(七):Dialog主题Activity实现自定义对话框效果
想必大家都用过Dialog主题的Activity吧,用它来显示自定义对话框效果绝对是一个非常不错的选择. 即把activity交互界面以Dialog的形式展现出来,Dialog主题的Activity大 ...
- Android 自定义View修炼-自定义弹幕效果View
一.概述 现在有个很流行的效果就是弹幕效果,满屏幕的文字从右到左飘来飘去.看的眼花缭乱,看起来还蛮cool的 现在就是来实现这一的一个效果,大部分的都是从右向左移动漂移,本文的效果中也支持从左向右的漂 ...
- UIVIewController自定义切换效果-b
之前介绍动画时提过UIView的转场动画,但是开发中我们碰到更多的viewController的切换,ios中常见的viewcontroller切换有四种:模态视图,导航栏控制器,UITabBar ...
- AndroidUI 视图动画-自定义动画效果 (Animation)
如果Android提供的四种动画 效果 和混合动画效果 不能够 满足需求的话,可以使用自定义动画效果 : 新建一个类CustomAnimation 使其继承自 android.view.animati ...
- [Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现
大家好,我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 今天我们来一起学习在Unity3D中怎样实现角色攀爬效果. 在RPG游戏中,某些游戏场景经常须要玩家 ...
- 用POP动画编写带富文本的自定义动画效果
用POP动画编写带富文本的自定义动画效果 [源码] https://github.com/YouXianMing/UI-Component-Collection [效果] [特点] * 支持富文本 * ...
- 自定义loading效果
结合Font Awesome字体图标自定义loading效果 Font Awesome字体图标地址:http://www.fontawesome.com.cn/faicons/ 使用javascrip ...
- spinner自定义,效果如腾讯QQ账号选择时候的下拉列表
下拉列表在android中自带spinner的有时候不太适合我们的界面,我们希望有自己的一种显示方法,那怎么办?自定义Spinner.效果如QQ账号选择一样.如图所以. 这种效果,如果你喜欢 ...
- Unity Shader入门精要学习笔记 - 第12章 屏幕后处理效果
建立一个基本的屏幕后处理脚本系统 屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效.使用这种技术,可以为游戏画面添加更多艺术效果,例如景深. ...
随机推荐
- TCP和UDP的Socket编程实验
Linux Socket 函数库是从 Berkeley 大学开发的 BSD UNIX 系统中移植过来的.BSD Socket 接口是在众多 Unix 系统中被广泛支持的 TCP/IP 通信接口,Lin ...
- c++_primer_第4版目录
https://vdisk.weibo.com/s/BN_NALmbbBH01 第1章 快速入门1.1 编写简单的C++程序1.2 初窥输入/输出1.2.1 标准输入与输出对象1.2.2 一个使用IO ...
- CentOS7 开机进入emergency mode
今天突然操作了一下磁盘挂载,然后系统启动之后,就直接进入emergency模式了,然后只能输入密码进行救援,截图如下: 突然想了一下最近的一次操作,是因为要挂在镜像,然后每次开机都要挂载一次,觉得比较 ...
- debug PostgreSQL 9.6.18 using Eclipse IDE on CentOS7
目录 debug PostgreSQL 9.6.18 using Eclipse IDE on CentOS7 1.概览 2.建立用户 3.编译postgre 4.启动Eclipse 5.设置环境变量 ...
- 手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)
在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...
- 浅析Java中Ant的使用
Ant是一种基于Java的打包工具,Ant脚本采用XML格式编写,默认的文件名为build.xml. Ant中常用的节点元素 Project Project是项目工程的顶级节点,一个build. ...
- Python3-threading模块-多线程
什么是线程? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 P ...
- Jmeter系列(34)- 详解 Counter 计数器
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 简单介绍 计数器的作用:循环递增生成数 ...
- BootstrapDialog.confirm确认对话框
1. 依赖文件: bootstrap.js bootstrap-dialog.js bootstrap.css bootstrap-dialog.css 2.代码 BootstrapDialog.co ...
- 2020年的六种编程语言排名中,java排第几只有不到1%的人知道
前言 编程语言是开发的基础.有不同的类型和特征,并且开发人员针对不同的场景选择正确的语言,但是您知道使用哪种语言吗?中国和世界各地有多少开发人员正在使用它?他们的排名是多少?快来看看您知道多少个列表! ...