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 Always
            ZWrite 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
        }

效果图

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity 3D是一款功能强大的游戏引擎,为开发者提供了丰富的特效全屏特效功能。全屏特效是一种在整个幕上展示出的动态效果,可以增强游戏的视觉效果和沉浸感。 在Unity 3D中,实现全屏特效的方法有很多种。一种常用的方式是使用Shader编程,通过编写自定义的Shader代码来实现特定的效果。Unity 3D提供了内置的Shader库,也可以创建自定义的Shader来实现各种炫酷的特效,比如全屏模糊、折射、反射等。 除了Shader编程之外,Unity 3D还提供了一些内置的特效组件和工具,可以方便地实现全屏特效。例如,Post-Processing Stack是一款强大的后期处理工具,可以通过简单的配置实现各种全屏特效,如色彩调整、景深、运动模糊等。这些特效可以使游戏更加生动和真实,提升玩家的游戏体验。 除了使用内置的特效组件和工具之外,Unity Asset Store还有许多第三方插件和资源包,可以方便地实现各种全屏特效。这些资源包包含了各种特效的预设和脚本,可以直接引用并进行调整,从而快速实现全屏特效而无需自行编写代码。 总而言之,Unity 3D是一款非常适合开发游戏的引擎,提供了丰富的特效全屏特效功能。通过使用Shader编程、内置的特效组件和工具,以及第三方资源包,开发者可以轻松实现各种炫酷的全屏特效,为游戏增添视觉上的吸引力和沉浸感。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值