Unity中后处理 脚本 和 Shader

文章目录

  • 前言
  • 一、我们先创建一个默认的后处理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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【科研论文】检索证明、科技查新、查收查引(附教育部、科技部查新工作站名单)

文章目录 1、什么是科技查新 & 查收查引2、科技查新 & 查收查引有什么用3、如何办理科技查新 & 查收查引4、教育部科技查新工作站5、科技部认定的查新机构名单 1、什么是科技查新 & 查收查引 科技查新是国家科技部为避免科研课题重复立项和客观正确地判别科研…

ChatGPT Plus重新开启订阅

12月14日凌晨,OpenAI首席执行官Sam Altman在社交平台宣布,终于找到了更多的GPU算力,重新开启订阅ChatGPT Plus。 上个月15日,OpenAI就因为算力不足,以及用户激增等原因暂停了ChatGPT Plus订阅。 Sam表示,在…

第78讲:截取MySQL Binlog二进制日志中特定部分内容的技巧

文章目录 1.为什么要截取Binlog日志中的部分内容2.针对标识位截取Binlog日志中的部分数据2.1.以标识位号截取Binlog日志的方法2.2.截取Binlog日志中的部分数据2.3.模拟简单基于标识位的Binlog数据恢复 3.针对事件范围截取Binlog日志中的部分数据 1.为什么要截取Binlog日志中的部…

Sublime Text 3配置C/C++开发环境

Sublime Text 3配置C/C开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 接入 mingw-w642.1 下载 mingw-w642.2 环境变量配置 3. 配置 C/C 开发环境3.1 C Build System 配置3.2 C Build System 配置 4. 编写 C/C 代码4.1 第一个 C 代码【helloworld.c】4.2 第一个 C 代码…

jmeter,跨线程调用cookie

结构目录 一、线程组1 1、创建登录的【HTTP请求】,并配置接口所需参数; 2、创建【正则表达式提取器】,用正则表达式提取cookie字段; 3、创建【调试取样器】,便于观察第2步提取出的数据; 4、创建【BeanSh…

构建外卖小程序:技术代码实践

在这个数字化的时代,外卖小程序已经成为餐饮业的一项重要工具。在本文中,我们将通过一些简单而实用的技术代码,向您展示如何构建一个基本的外卖小程序。我们将使用微信小程序平台作为例子,但这些原理同样适用于其他小程序平台。 …

钉钉机器人发送表格

背景: 由于每次发送excel连接,不太好看,想着简单的表格直接用消息的方式发送在群里,就想着弄一个直接发送的表格信息,但是钉钉官网是没有的。 我估计钉钉的开发人员也没有想过,会有人钻空子,用markdown发送…

从YOLOv1到YOLOv8的YOLO系列最新综述【2023年4月】

作者:Juan R. Terven 、Diana M. Cordova-Esparaza 摘要:YOLO已经成为机器人、无人驾驶汽车和视频监控应用的核心实时物体检测系统。我们对YOLO的演变进行了全面的分析,研究了从最初的YOLO到YOLOv8每次迭代的创新和贡献。我们首先描述了标准…

Mac清理软件cleanmymac x4.14.4破解版,2024年有免费cleanmymac x激活码

​ CleanMyMac X 4.14.4破解版可以快速识别并删除占用磁盘空间的无用文件,提升我们系统的存储空间。它还可以优化启动项、修复系统错误和保护隐私等。总之CleanMyMac X十分强大有需要的赶快下载吧, CleanMyMac X 许可证激活码:ak39840506641bjckr 需要…

Educoder/头歌JAVA——jQuery基础

目录 第1关:jQuery入门 相关知识 环境安装 第一个程序 id选择器 第2关:jQuery基本选择器 相关知识 类选择器 元素选择器 编程要求 第3关:过滤选择器 (一) 相关知识 设置css属性 编程要求 第4关&#xff1…

LLM之RAG实战(四):Self-RAG如何革命工业LLM

论文地址:https://arxiv.org/pdf/2310.11511.pdf Github地址:https://github.com/AkariAsai/self-rag 尽管LLM(大型语言模型)的模型和数据规模不断增加,但它们仍然面临事实错误的问题。现有的Retrieval-Augmented Gen…

Linux本地docker一键部署traefik+cpolar实现远程访问dashboard界面

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件,能轻易的部署微服务。它支持多种后端 (D…

pycharm中如何去除波浪线的设置

pycharm中,碰到恼人的红绿波浪线,打开’file-settings’,然后,参照如图设置,去除’effects’选项:

SQL注入靶场—sqli-labs安装

第一步:从下面的网址下载sqli-labs软件包 ①、、下载安装phpstudy(直接解压安装即可) 链接:https://pan.baidu.com/s/1X8G_qXnTXQh_S3NAF2ux_A 提取码:2693 --来自百度网盘超级会员V4的分享 ①、下载sqli-labs压缩…

看看CHAT是怎么写MPP开发和调度策略

CHAT回复:MPP(Massively Parallel Processing)开发和调度策略是一种并行处理技术,主要用于大规模数据仓库和数据竞赛应用。 1. 数据分布:这是MPP系统的主要特点,也是其能够提高性能和吞吐量的主要原因。通常…

CSS

注释标签的快捷键:Ctrl/ 1,选择器写法 类选择器:重要重要重要 id选择器:样式#定义,结构id调用,只能调用一次 。div就是一个盒子,用来装网页内容的 通配符选择器:不需要调用&#x…

【华为数据之道学习笔记】5-2华为数据湖的特点

华为数据湖是逻辑上对内外部的结构化、非结构化的原始数据的逻辑汇聚。数据入湖要遵从6项入湖标准,基于6项标准保证入湖的质量,同时面向不同的消费场景提供两种入湖方式,满足数据消费的要求。经过近两年的数据湖建设,目前已经完成…

芒果RT-DETR改进实验:深度集成版目标检测 RT-DETR 热力图来了!支持自定义数据集训练出来的模型

💡该教程为改进RT-DETR指南,属于《芒果书》📚系列,包含大量的原创改进方式🚀 💡🚀🚀🚀内含改进源代码 按步骤操作运行改进后的代码即可💡更方便的统计更多实验数据,方便写作 芒果RT-DETR改进实验:深度集成版目标检测 RT-DETR 热力图来了!支持自定义数据集…

c++ qt 窗口开发中 俩按钮组合 配合 显影 已解决

在日常项目中,有这么需求,还想窗口移动,还想 右侧关闭 还能tab栏点击显影的需求,不得使用 qt模拟点击事件 进行功能优化 特大杯 大杯 控制 窗口显影, 咖啡 按钮 显示窗口 可乐 豆浆 不显示窗口 四个按钮的 互斥关…

go学习之网络编程

文章目录 网络编程1、网络编程的基本介绍2.网络编程的基础知识1)协议(tcp/ip)2)OSI与TCP/ip参考模型3)ip地址4)端口(port)介绍5)tcp socket编程的客户端和服务器端 3.socket编程快速入门4.经典项目-海量用户即时通讯系…