Unity中后处理 脚本 和 Shader

news2024/12/23 9:28:09

文章目录

  • 前言
  • 一、我们先创建一个默认的后处理Shader,用于脚本测试
  • 二、在脚本中使用Graphics.Blit();
    • 1、我们先公开一个材质,用于测试后处理效果
    • 2、因为在实际开发中,我们不可能为每一个后处理Shader创建对应的材质球。所以,需要对该脚本进行修改,让脚本直接使用Shader
  • 三、后处理Shader
    • 1、后处理Shader需要遵守的条件
    • 2、后处理效果 几乎都是 在片元着色器中实现的
    • 3、这是简化后的 后处理Shader代码
  • 三、最终测试脚本


前言

我们在上篇文章中提到,在Unity中实现后处理效果,需要同时结合 脚本 和 Shader,我们在这篇文章中编写所需要使用的C#脚本 和 Shader。

  • Unity中后处理简介

一、我们先创建一个默认的后处理Shader,用于脚本测试

在这里插入图片描述

  • 在该Shader的片元着色器中,我们可以看出,这个Shader主要做了一个反色处理。

在这里插入图片描述

二、在脚本中使用Graphics.Blit();

该语句需要在OnRenderImage生命周期函数内使用。
而该生命周期只对我们的摄像机生效

1、我们先公开一个材质,用于测试后处理效果

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//后处理脚本
public class P2_7_3 : MonoBehaviour
{
    public Material Mat;
    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        Graphics.Blit(source,destination,Mat);
    }
}

  • 把该脚本挂载在摄像机上
    在这里插入图片描述

  • 开启游戏后,我们看见我们的后处理Shader生效了

请添加图片描述

2、因为在实际开发中,我们不可能为每一个后处理Shader创建对应的材质球。所以,需要对该脚本进行修改,让脚本直接使用Shader

  • 创建一个公共成员变量,用于接收Shader

public Shader PostProcessingShader;

  • 创建一个成员属性,对其get方法进行修改,使其返回一个用我们Shader创建的材质
	private Material mat;

    public Material Mat
    {
        get
        {
            if (PostProcessingShader == null)
            {
                Debug.LogError("没有赋予Shader");
                return null;
            }

            if (!PostProcessingShader.isSupported)
            {
                Debug.LogError("当前Shader不支持");
                return null;
            }

            Material _newMaterial = new Material(PostProcessingShader);
            _newMaterial.hideFlags = HideFlags.HideAndDontSave;
            return _newMaterial;
        }
    }
  • 把我们的脚本挂载在摄像机,把Shader赋予脚本,我们看看效果

在这里插入图片描述

请添加图片描述

  • 使用[ExecuteInEditMode]特性给我们的Mono脚本,能使我们的脚本在编辑器模式下运行。

三、后处理Shader

1、后处理Shader需要遵守的条件

因为,后处理效果处理的是摄像机前的一个面片效果。
所以,是不需要面片剔除 和 深度效果的。需要把这两个功能相关的东西关闭,防止影响处理后的效果

Cull Off
ZWrite Off
ZTest Always

2、后处理效果 几乎都是 在片元着色器中实现的

因为后处理效果几乎都是在片元着色器中实现。所以,其余部分的功能几乎都没有变化。Unity对此进行了一些优化,我们可以直接使用。

  • Unity在 UnityCG.cginc 中帮我们定义了后处理中常用的 appdata 结构体

在这里插入图片描述

  • Unity在 UnityCG.cginc 中帮我们定义了后处理中常用的 v2f 结构体

在这里插入图片描述

  • Unity在 UnityCG.cginc 中帮我们定义了后处理中常用的 顶点着色器

在这里插入图片描述

3、这是简化后的 后处理Shader代码

Shader "Hidden/P2_7_4"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        // No culling or depth
        Cull Off 
        ZWrite Off 
        ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag

            #include "UnityCG.cginc"
            
            sampler2D _MainTex;

            fixed4 frag (v2f_img i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                // just invert the colors
                col.rgb = 1 - col.rgb;
                return col;
            }
            ENDCG
        }
    }
}

三、最终测试脚本

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//后处理脚本
public class P2_7_3 : MonoBehaviour
{
    public Shader PostProcessingShader;

    private Material mat;

    public Material Mat
    {
        get
        {
            if (PostProcessingShader == null)
            {
                Debug.LogError("没有赋予Shader");
                return null;
            }

            if (!PostProcessingShader.isSupported)
            {
                Debug.LogError("当前Shader不支持");
                return null;
            }

            Material _newMaterial = new Material(PostProcessingShader);
            _newMaterial.hideFlags = HideFlags.HideAndDontSave;
            return _newMaterial;
        }
    }

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        Graphics.Blit(source,destination,Mat);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1305708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flink-1.17.2的单节点部署

flink 简介 Apache Flink 是一个开源的流处理和批处理框架,用于大数据处理和分析。它旨在以实时和批处理模式高效处理大量数据。Flink 支持事件时间处理、精确一次语义、有状态计算等关键功能。 以下是与Apache Flink相关的一些主要特性和概念: 流处理…

MySQL进阶(MySQL学习笔记)

接上回MySQL基础篇 数据完整性约束 定义完整性约束 实体完整性 主键约束 (1)作为列的完整性约束 (2)作为表的完整性约束 2.候选键约束 将id字段和user字段设置为候选键 参照完整性 将classid字段设置为外键 用户定义完整性…

【数据结构第 6 章 ②】- 用 C 语言实现邻接矩阵

目录 一、邻接矩阵表示法 二、AMGraph.h 三、AMGraph.c 四、Test.c 【数据结构第 6 章 ① 】- 图的定义和基本术语-CSDN博客 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系&…

内核上项目【通信】

文章目录 目的操作步骤逆向分析实现代码参考文献 目的 在Win7 64位系统上编写驱动利用ExRegisterAttributeInformationCallback注册回调进行通信 操作步骤 1.利用MmGetSystemRoutineAddress获取ExRegisterAttributeInformationCallback中ExpDisSetAttributeInformation、Exp…

detectron2中save_text_instance_predictions⭐

save_text_instance_predictions demo.py中修改关于路径os.path.join()函数用于路径拼接文件路径,可以传入多个路径os.path.basename(path)就是给定一串路径的最终找到的那个文件python官方文档链接 将 Python 对象序列化为 JSON 字符串with open 打开文件&#xff…

基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI

前言 定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布、定时更新某一个业务状态、定时删除一些冗余数据等等。今天给大家推荐一个基于.NET Core Quartz.NET Vue IView开箱即用的定时任务UI(不依赖数据库,只需在界面做简单配…

java--HashMap、LinkedHashMap、TreeMap底层原理

1.HashMap集合的底层原理 ①HashMap跟HashSet的底层原理是一模一样的,都是基于哈希表实现的。 ②实际上:原来学的Set系列集合的底层原理就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。 2.哈希表 ①JDK8之前…

如何使用nacos进行配置管理以及代码集成

首先需要在maven的pom文件中引入nacos-config依赖 <!--nacos配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency> 在项目中添加boo…

好用便签有什么软件?好用的便签是什么

在工作中&#xff0c;我经常需要记录一些重要的信息&#xff0c;以便在需要时能够快速查找。但是&#xff0c;我曾经使用过的便签软件总是让我感到不满意&#xff0c;要么功能不够强大&#xff0c;要么使用起来不够方便。我一直在寻找一款好用的便签软件&#xff0c;能够让我事…

使用Kali Linux端口扫描

端口扫描 【实训目的】 掌握端口扫描的基本概念和端口扫描的原理&#xff0c;掌握各种类型端口扫描的方法及其区别。 【场景描述】 在虚拟机环境下配置4个虚拟系统“Win XP1” “Win XP2” “Kali Linux”和“Metasploitable2”&#xff0c;使得4个系统之间能够相互通信。实…

软件兼容性测试:保障多样化用户体验的重要功能

随着移动设备和操作系统的快速发展&#xff0c;软件兼容性测试变得越发重要。这项测试确保软件在不同平台、设备和环境下都能够正常运行&#xff0c;提供一致而稳定的用户体验。下面是软件兼容性测试中的一些关键功能&#xff1a; 1. 跨平台兼容性测试 在不同操作系统上运行的软…

【PHP编程实战】手把手教你如何下载文件,实例代码详解!

本文将向大家详细介绍PHP文件下载实例代码&#xff0c;具有一定的参考价值。对于一个网站而言&#xff0c;文件下载功能几乎是必备的。因此&#xff0c;了解如何使用PHP实现文件下载是非常必要的。在接下来的内容中&#xff0c;我们将一起探讨PHP文件下载的实现方法。 无控制类…

串口实验(中断)

需求&#xff1a; 通过中断的方法接受串口工具发送的字符串&#xff0c;并将其发送回串口工具。 硬件接线&#xff1a; 同上 串口配置&#xff1a; 前 4 步同上 5. 打开中断 编程实现&#xff1a; 1、这段代码主要实现了在接收到回车符时判断是否接收到换行符&#xff0c…

正态总体的区间估计

目录 一、区间估计 1.区间估计原理 2.区间估计定义 二、三大分布 1.正态分布 2.χ分布 3.t分布 三、 情况分类 1. μ 的区间估计 (1)已知σ (2)未知σ 2. σ的区间估计 四、公式推导 1.标准正态分布 2.t分布 3. χ分布 五、例题 一、区间估计 1.区间估计原理…

前沿重器[39] | 对话式推荐系统——概念和技术点

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

P1单片机定时器配置及定时器中断——C51(超详细)

目录 1. 简介 1.1 概念解读 1.2 定时器怎么定时 1.什么是晶振 2.什么是时钟周期 3.什么是机器周期 4.加1经过了多少时间 1.3 定时器编程 1.如何算出10ms定时器的初值(TL0 TH0) 2.关于TCON ,怎么知道爆表 3.怎么开始计时(TR0) 4.定时器使用是有很多种模式的&#xf…

sylar高性能服务器-配置(P10-p11)代码解析+调试分析

文章目录 p9&#xff1a;配置模块搭建一、ConfigvarBase二、ConfigVar三、Config四、小结 p10&#xff1a;YAML的使用一、安装yaml-cpp二、使用yaml-cpp三、代码解析 P11&#xff1a;YAML与日志的整合一、方法函数二、代码调试三、test_config结果四、小结 p9&#xff1a;配置模…

2023年全球软件开发大会(QCon广州站2023)-核心PPT资料下载

一、峰会简介 本次峰会包含&#xff1a;泛娱乐时代的边缘计算与通讯、稳定性即生命线、下一代软件架构、出海的思考、现代数据架构、AGI 与 AIGC 落地、大前端技术探索、编程语言实战、DevOps vs 平台工程、新型数据库、AIGC 浪潮下的企业出海、AIGC 浪潮下的效能智能化、数据…

联邦边缘学习中的知识蒸馏综述

联邦边缘学习中的知识蒸馏综述 移动互联网的快速发展伴随着智能终端海量用户数据的产生。如何在保护数据隐私的前提下,利用它们训练出性能优异的机器学习模型,一直是业界关注的难点。为此,联邦学习应运而生,它允许在终端本地训练并协同边缘服务器进行模型聚合来实现分布式机器…

C++字符串插入函数(insert)

1.在下标为n处插入y #include <iostream> #include <algorithm> #include <string> using namespace std;string x,y; int n;int main() {cin>>x>>y>>n;x.insert(n,y); //在下表为n处插入ycout<<x<<endl;return 0; }2…待续