Unity URP Fullscreen 全屏特效 绘制全屏四边面并重建世界空间位置

本文主要是介绍Unity URP Fullscreen 全屏特效 绘制全屏四边面并重建世界空间位置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在URP中我们可以插入自己的RenderFeature来实现一些特殊的效果。

首先我们需要创建两个C#类,分别继承ScriptableRendererFeatureScriptableRenderPass

这里我创建了TestRenderFeatureTestPass

我在TestRenderFeatureCreate方法中初始化TestPass,在AddRenderPasses中调用renderer.EnqueuePass(_testPass);执行相关的渲染操作。

TestRenderFeature.cs
    public class TestRenderFeature : ScriptableRendererFeature{public Material _material;private TestPass _testPass;public override void Create(){if (_material== null){Debug.LogError("material can't be null");}_testPass=new TestPass (_material);}public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){renderer.EnqueuePass(_testPass);}}
TestPass.cs
public class TestPass : ScriptableRenderPass
{const string m_ProfilerTag = "Test Pass";private Material material;public TestPass (Material material){this.material = material;renderPassEvent = RenderPassEvent.AfterRenderingTransparents;// 设置Pass插入的位置}public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){if (material == null)return;var camera = renderingData.cameraData.camera;var cmd = CommandBufferPool.Get(m_ProfilerTag);///以下为绘制全屏四边面的代码/cmd.SetViewProjectionMatrices(Matrix4x4.identity, Matrix4x4.identity);cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, material);cmd.SetViewProjectionMatrices(camera.worldToCameraMatrix, camera.projectionMatrix);context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}
}
Shader相关代码

使用GetPositionInput,传入屏幕坐标、屏幕尺寸的倒数、原始深度、UNITY_MATRIX_I_VP、UNITY_MATRIX_V,返回一个PositionInputs类型的结构体,结构体内包含世界空间坐标(positionWS)、归一化的屏幕坐标positionNDC、线性深度linearDepth

这个函数定义在com.unity.render-pipelines.core\ShaderLibrary\Common.hlsl,我使用的版本为8.2.0

Pass{ZTest AlwaysZWrite Off//用HLSL吧HLSLPROGRAM#pragma vertex vert#pragma fragment frag//记得引入这个头文件#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = TransformObjectToHClip(v.vertex);//uv直接传过去即可o.uv=v.uv;return o;}float4 frag (v2f i) : SV_Target{float depth = LoadSceneDepth(i.uv*_ScreenParams.xy);//PositionInputs GetPositionInput(float2 positionSS, float2 invScreenSize, float deviceDepth,float4x4 invViewProjMatrix, float4x4 viewMatrix)//这里的i.uv实际上相当于归一化的屏幕坐标,让它乘以屏幕尺寸得到未归一化的屏幕坐标                PositionInputs inputs= GetPositionInput(i.uv * _ScreenParams.xy, _ScreenParams.zw-1, depth,UNITY_MATRIX_I_VP,UNITY_MATRIX_V);return float4(min(inputs.positionWS.x,1),min(inputs.positionWS.y,1),min(inputs.positionWS.z,1),1);}ENDHLSL}
效果图

在这里插入图片描述

这篇关于Unity URP Fullscreen 全屏特效 绘制全屏四边面并重建世界空间位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么