Unity自定义后处理——Vignette暗角

news2025/2/22 17:57:30

  大家好,我是阿赵。
  继续说一下屏幕后处理的做法,这一期讲的是Vignette暗角效果。

一、Vignette效果介绍

  Vignette暗角的效果可以给画面提供一个氛围,或者模拟一些特殊的效果。
还是拿这个角色作为底图
在这里插入图片描述

添加了Vignette效果后,屏幕的四边会产生一个像老式电视机一样的压暗的效果,
在这里插入图片描述

通过调节参数,可以做出形状比较夸张的压暗效果
在这里插入图片描述

在这里插入图片描述

  如果加上闪烁和横纹之类,也可以模拟老式电影的效果。

二、实现原理

1、以屏幕中心点计算每个像素点的距离

float2 screenUV = abs(i.uv - float2(0.5f,0.5f))*_VignetteIntensity;
float dist = length(screenUV);
col.rgb *= dist;

在这里插入图片描述

  这时候,由于屏幕靠中间的点离屏幕中心点(0.5f,0.5f)近,然后边缘的点里屏幕中心点远,所以得到的效果是中间黑,四周白。

2、给距离做power计算,让边缘形状变成接近矩形

float2 screenUV = abs(i.uv - float2(0.5f,0.5f))*_VignetteIntensity;
screenUV = pow(saturate(screenUV), _VignetteSmoothness);
float dist = length(screenUV);
col.rgb *= dist;

在这里插入图片描述

  经过计算后,现在的黑白变成了比较接近屏幕矩形。当然,这个和pow的参数有关,调节不同的参数,可以得到不同的形状。

3、给黑白做反向

float2 screenUV = abs(i.uv - float2(0.5f,0.5f))*_VignetteIntensity;
screenUV = pow(saturate(screenUV), _VignetteSmoothness);
float dist = length(screenUV);
float vfactor = pow(saturate(1 - dist * dist), _VignetteSmoothness);
col.rgb *= vfactor;

在这里插入图片描述

  这时候,可以看到,暗角的效果就做出来了。

三、完整代码

1、C#代码

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

public class VignetteCtrl : MonoBehaviour
{
    [Range(0, 3)]
    public float vignetteIntensity = 1.8f;
    [Range(0, 5)]
    public float vignetteSmoothness = 5;
    private Material vignetteMat;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        if (vignetteMat == null)
        {
            vignetteMat = new Material(Shader.Find("Hidden/AzhaoVignette"));
        }
        if (vignetteMat == null || vignetteMat.shader == null || vignetteMat.shader.isSupported == false)
        {
            return;
        }
        vignetteMat.SetFloat("_VignetteIntensity", vignetteIntensity);
        vignetteMat.SetFloat("_VignetteSmoothness", vignetteSmoothness);
        Graphics.Blit(source, destination, vignetteMat, 0);
    }
}

2、Shader

Shader "Hidden/AzhaoVignette"
{
	CGINCLUDE
#include "UnityCG.cginc"

	sampler2D _MainTex;
	float4 _MainTex_TexelSize;

	float _VignetteIntensity;
	float _VignetteSmoothness;

	half4 fragVignette(v2f_img i) : SV_Target
	{
		half4 col = tex2D(_MainTex, i.uv);


		//暗角
		float2 screenUV = abs(i.uv - float2(0.5f,0.5f))*_VignetteIntensity;
		screenUV = pow(saturate(screenUV), _VignetteSmoothness);
		float dist = length(screenUV);
		float vfactor = pow(saturate(1 - dist * dist), _VignetteSmoothness);
		col.rgb *= vfactor;

		return col;
	}


		ENDCG
		Properties
	{
		_MainTex("Texture", 2D) = "white" {}
		_VignetteIntensity("VignetteIntensity", Range(0, 3)) = 1
		_VignetteSmoothness("VignetteSmoothness", Range(0, 5)) = 1
	}
	SubShader
	{
		// No culling or depth
		Cull Off ZWrite Off ZTest Always
		//0校色
		Pass
		{
			CGPROGRAM
			#pragma vertex vert_img
			#pragma fragment fragVignette            


			ENDCG
		}
	}
}

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

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

相关文章

网络安全(黑客)万字自学笔记

目录 特别声明: 一、前言 二、定义 三、分类 1.白帽黑客(White Hat Hacker) 2.黑帽黑客(Black Hat Hacker) 3.灰帽黑客(Gray Hat Hacker) 四、黑客文化 五、伦理问题 六、黑客的作用 …

论文--高通量田间植物表型:一种用于分割重叠植物的自监督序列CNN方法

Title: High-Throughput Field Plant Phenotyping: A Self-Supervised Sequential CNN Method to Segment Overlapping Plants Abstract: High-throughput plant phenotyping—the use of imaging and remote sensing to record plant growth dynamics—is becoming more wide…

为什么企业需要集中采购?

大多数企业在寻找合适的采购系统时都会遇到困难。尤其是大多数 CPO 和 CFO ,他们在集中采购系统与分散采购系统之间难以选择。如果你的企业尚未建立集中采购,那么将会失去集中采购系统所能实现的杠杆定价。 什么是集中采购? 集中采购可定义…

cookie 生命周期和cookie有效路径超级详细讲解

文章目录 cookie 生命周期和cookie有效路径超级详细讲解cookie 生命周期介绍代码示例完成测试 , 注意抓包看数据 cookie 有效路径有效路径规则规则如下:代码示例完成测试 , 注意抓包看创建 Cookie 时,返回的数据完成测试 , 注意抓包看读取 Cookie 时,返回的数据 代码示例html页…

ChatGPT 最佳实践指南之:系统地测试变化

Test changes systematically 系统地测试变化 Improving performance is easier if you can measure it. In some cases a modification to a prompt will achieve better performance on a few isolated examples but lead to worse overall performance on a more representa…

Failed to start File System Cehck on Root Device

偶遇服务器异常断电,Ubuntu后无法启动,出现如标题所示提示信息,详细内容出下图: 解决办法:将系统磁盘更换至另一台Ubuntu服务器中,对sda3分区中的ubuntu--vg-root分区进行修复后即可,操作内容如…

【UE4 塔防游戏系列】08-敌人到达终点对玩家造成伤害

目录 效果 步骤 一、敌人到终点时扣除玩家生命值 二、显示玩家生命值 效果 可以看到敌人进入终点后,左上角的玩家生命值会减少。 步骤 一、敌人到终点时扣除玩家生命值 新建一个Actor蓝图类,命名为“BP_EnemyEndPlace”,用来表示终点…

(学习笔记)TCP基础知识

什么是TCP? TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接:一定是[一对一]才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:无论网络链路中出现了…

spring复习:(38)ProxyFactoryBean中使用jdk动态代理生成代理对象时,业务方法调用时的执行流程

当调用代理对象的业务方法时,会直接执行JdkDynamicAopProxy类的invoke方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object oldProxy null;boolean setProxyContext false;TargetSource targetSource this.advised…

Matter初探

这是运行gn_build.sh之后输出的日志 Script started on 2023-07-17 09:39:460800 ]0;userubuntu: ~/Matter/connectedhomeip[01;32muserubuntu[00m:[01;34m~/Matter/connectedhomeip[00m$ source gn_build.sh [0;33m.--------------------------------[0m [0;33m-- Environmen…

【项目 进程2】2.3 进程创建 2.4父子进程虚拟地址空间 2.5GDB多进程调试

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 2.3 进程创建2.4 父子进程虚拟地址空间父子进程之间的关系: 2.5 GDB多进程调试 2.3 进程创建 系统允许一个进程创建新进程,新进程即为子进程…

特征缩放(归一化处理)

在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。 以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000平方英尺,而房间数…

CAPL(vTESTStudio) - CAPL实现CANCANFD接收

诊断作为CAN&CANFD总线测试中最大也是很重要的一块内容,虽然测试过程比较简单,但是作为诊断接收函数,我想大家在测试中都会遇到多种多样的自研函数,经过多年的工作,我也是一直希望写出一个能够适配我所能想到的所有情况的诊断应答接收,以下函数是我最近对于诊断接收函…

欧姆龙cp11以太网设置连接力控方法

JM-ETH-CP转以太网模块采用即插即用设计,不占用 PLC 通讯口,即编程软件/上位机软件通过以太网对 PLC 数据监控的同时,触摸屏可以通过复用接口与 PLC 进行通讯。捷米特JM-ETH-CP转以太网模块支持工控领域内绝大多数 SCADA 软件,支持…

大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍

大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍 1.大语言模型的预训练 1.LLM预训练的基本概念 预训练属于迁移学习的范畴。现有的神经网络在进行训练时,一般基于反向传播(Back Propagation&…

如何免费试用阿里云上资源搭建ChatGLM2+langchain

如何免费试用阿里云上资源搭建ChatGLM2langchain 1.找到免费试用,搜索PAI 2.试用PAI-DSW和NAS 3.找到这个平台打开 4.创建工作空间和实例 这里已经创建过了,没有图 5.对着视频一步一步走

浅析Java编程中类和对象的定义

浅析Java编程中类和对象的定义 1,什么是类? 答:类是客观存在的,抽象的,概念的东西。 2,什么事对象? 答:对象是具体的,实际的,代表一个事物。例如&#xff…

SpringCloud(一)微服务项目搭建

一、简介 SpringCloud是Spring提供的一套分布式解决方案,集合了一些大型互联网公司的开源产品,包括诸多组件,共同组成SpringCloud框架。并且,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服…

网络安全—信息安全—黑客技术(学习笔记)

一、什么是网络安全? 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都…

【iOS】探索ARC的实现

ARC ARC在编译期和运行期做了什么?编译期:运行期:block 是如何在 ARC 中工作的? ARC的实现分析__strong自己生成并持有storeStrongSideTable散列表objc_retainobjc_releasesidetable_releaseretainCount非自己生成并持有 ARC在编译…