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

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87