Unity中URP下抓屏的 开启 和 使用

这篇具有很好参考价值的文章主要介绍了Unity中URP下抓屏的 开启 和 使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

我们在这篇文章中看一下,URP下怎么开启抓屏。


一、抓屏开启

1、Unity下开启抓屏

  • 在URP下,打开下面这个选项
    Unity中URP下抓屏的 开启 和 使用,Unity,unity,游戏引擎
  • Frame Debugger下可以看见 CopyColor 就是我们上一帧的内容
    Unity中URP下抓屏的 开启 和 使用,Unity,unity,游戏引擎
  • Opaque Downsampling改变截取的帧精度
    Unity中URP下抓屏的 开启 和 使用,Unity,unity,游戏引擎

2、Shader中开启抓屏

  • 使用不透明渲染队列才可以使用深度图
  • Render Queue < 2500 时才可以使用深度图
    Unity中URP下抓屏的 开启 和 使用,Unity,unity,游戏引擎

Tags{“Queue”=“Geometry}”

  • 开启Zwrite

Zwrite On


二、抓屏使用

  • 我们这里创建一个面片来测试一下

1、设置为半透明渲染队列,关闭深度写入

  • 因为,要用面片显示抓取的内容。
  • 所以,我们得让抓屏不把该面片抓进去,需要抓取的其他物体开启抓屏。

Tags{“Queue”=“Transparent”}

ZWrite Off

2、申明纹理和采样器

TEXTURE2D(_CameraOpaqueTexture);SAMPLER(sampler_CameraOpaqueTexture);

  • 也可以直接使用hlsl内部定义

#define REQUIRE_OPAQUE_TEXTURE

3、在片元着色器使用

  • 使用模型uv采样

float4 opaqueMap = SAMPLE_TEXTURE2D(_CameraOpaqueTexture,sampler_CameraOpaqueTexture,i.uv);
return opaqueMap;

Unity中URP下抓屏的 开启 和 使用,Unity,unity,游戏引擎

  • 使用屏幕uv采样(为了使其效果明显,我们给输出结果加上0.3)

float2 uv = i.positionCS.xy/ _ScreenParams.xy;
float4 opaqueMap = SAMPLE_TEXTURE2D(_CameraOpaqueTexture,sampler_CameraOpaqueTexture,uv);
return opaqueMap+0.3;文章来源地址https://www.toymoban.com/news/detail-805217.html

Unity中URP下抓屏的 开启 和 使用,Unity,unity,游戏引擎

三、测试代码

Shader "MyShader/URP/P4_2"
{
    Properties 
    {
        _Color("Color",Color) = (0,0,0,0)
        _MainTex("MainTex",2D) = "white"{}
    }
    SubShader
    {
        Tags
        {
            //告诉引擎,该Shader只用于 URP 渲染管线
            "RenderPipeline"="UniversalPipeline"
            //渲染类型
            "RenderType"="Transparent"
            //渲染队列
            "Queue"="Transparent"
        }
        //Blend One One
        ZWrite Off
        Pass
        {
            Name "Unlit"
          
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // Pragmas
            #pragma target 2.0
            
            // Includes
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"

            CBUFFER_START(UnityPerMaterial)
            half4 _Color;
            CBUFFER_END

            
            //纹理的定义,如果是编译到GLES2.0平台,则相当于sample2D _MainTex;否则相当于 Texture2D _MainTex;
            TEXTURE2D(_MainTex);SAMPLER(SamplerState_linear_mirrorU_ClampV); float4 _MainTex_ST;
            TEXTURE2D(_CameraDepthTexture);SAMPLER(sampler_CameraDepthTexture);
            TEXTURE2D(_CameraOpaqueTexture);SAMPLER(sampler_CameraOpaqueTexture);
            
            //struct appdata
            //顶点着色器的输入
            struct Attributes
            {
                float3 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };
            //struct v2f
            //片元着色器的输入
            struct Varyings
            {
                float4 positionCS : SV_POSITION;
                float2 uv : TEXCOORD0;
                float4 screenPos : TEXCOORD1;
            };
            //v2f vert(Attributes v)
            //顶点着色器
            Varyings vert(Attributes v)
            {
                Varyings o = (Varyings)0;
                float3 positionWS = TransformObjectToWorld(v.positionOS);
                o.positionCS = TransformWorldToHClip(positionWS);
                o.uv = TRANSFORM_TEX(v.uv,_MainTex);
                o.screenPos = ComputeScreenPos(o.positionCS);
                return o;
            }
            //fixed4 frag(v2f i) : SV_TARGET
            //片元着色器
            half4 frag(Varyings i) : SV_TARGET
            {
                half4 c;
                
                float4 mainTex = SAMPLE_TEXTURE2D(_MainTex,SamplerState_linear_mirrorU_ClampV,i.uv);
                //c = _Color *  mainTex;
                //深度图
                //float2 uv = i.screenPos.xy / i.screenPos.w;
                //float2 uv = i.positionCS.xy/ _ScreenParams.xy;
                //float4 cameraDepthTex = SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,uv);
                //float depthTex = Linear01Depth(cameraDepthTex,_ZBufferParams);
                //抓屏
                float2 uv = i.positionCS.xy/ _ScreenParams.xy;
                float4 opaqueMap = SAMPLE_TEXTURE2D(_CameraOpaqueTexture,sampler_CameraOpaqueTexture,uv);
                return opaqueMap;
            }
            ENDHLSL
        }
    }

    SubShader
    {
        Tags
        {
            //渲染类型
            "RenderType"="Transparent"
            //渲染队列
            "Queue"="Transparent"
        }
        //Blend One One
        ZWrite Off
        Pass
        {
           
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // Pragmas
            #pragma target 2.0
            
            // Includes
            #include "UnityCG.cginc"
            
           
            half4 _Color;
            sampler2D _MainTex;float4 _MainTex_ST;
            sampler2D _CameraDepthTexture;
            
            
            struct appdata
            {
                float3 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };
            
            struct v2f
            {
                float4 positionCS : SV_POSITION;
                float2 uv : TEXCOORD0;
                float4 screenPos : TEXCOORD1;
            };
          
            v2f vert(appdata v)
            {
                v2f o;
                o.positionCS = UnityObjectToClipPos(v.positionOS);
                o.uv = TRANSFORM_TEX(v.uv,_MainTex);
                o.screenPos = ComputeScreenPos(o.positionCS);
                return o;
            }
            //fixed4 frag(v2f i) : SV_TARGET
            //片元着色器
            half4 frag(v2f i) : SV_TARGET
            {
                half4 c;
                
                float4 mainTex = tex2D(_MainTex,i.uv);
                //c = _Color *  mainTex;
                //深度图
                //float2 uv = i.screenPos.xy / i.screenPos.w;
                float2 uv = i.positionCS/ _ScreenParams.xy;
                float4 cameraDepthTex = tex2D(_CameraDepthTexture,uv);
                float depthTex = Linear01Depth(cameraDepthTex);
                return depthTex;
            }
            ENDCG
        }
    }
}

到了这里,关于Unity中URP下抓屏的 开启 和 使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity URP】URP Camera使用及动态设置

    官方文档:   摄像机 | Universal RP | 12.1.1 https://docs.unity3d.com/cn/Packages/com.unity.render-pipelines.universal@12.1/manual/cameras.html 相机类型: Render Type(渲染类型) Base(基础相机):渲染到特定渲染目标的通用相机,场景中必须至少有一个。 Overlay(叠加相机):将其视图渲染在另一个摄

    2024年02月12日
    浏览(46)
  • Unity URP相机使用简介

    使用URP后,相机组件的面板发生了变化,如下图。接下来简单的介绍下URP下的相机使用 RenderType 有2个选项,Base和Overlay。如下图 Overlay的相机无法单独显示,可以看到Game窗口一片黑 Base类型的相机可以单独显示,把RenderType模式修改为Base,可以看到Game窗口显示出来了 前面说了

    2024年02月10日
    浏览(52)
  • Unity的URP下使用SRPBatcher

    回到目录 大家好,我是阿赵。这里继续来讲一下URP相关的东西。 这次主要说的是SRP Batcher的使用 在我们创建的URPAsset文件的高级选项里面,有一个SRP Batcher的开关,默认就是勾上的。 在把项目转换为URP后,会看到shader属性里面出现了SRP Batcher的项 如果是自己写的shader,在没有

    2024年02月09日
    浏览(36)
  • Unity 基于URP使用HighlightPlus高亮插件

    本文章只说明使用步骤,怎么设定引用HighlightPlus高亮插件,不做详细介绍。 1) 确保已安装Universal Rendering Pipeline渲染管线资产(从Package Manager中查看)。 2) 转到“Project Settings / Graphics”。 3) 双击“Universal Rendering Pipeline asset”资源。   4) 双击“Forward Renderer asset”资源。

    2024年02月12日
    浏览(43)
  • Unity 基于URP使用Highlight Plus实现物体高亮

    内容将会持续更新,有错误的地方欢迎指正,谢谢!   Unity 基于URP使用Highlight Plus实现物体高亮       TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速实现 Highlight Plus 基于URP的物体高亮 为初学

    2024年02月05日
    浏览(38)
  • unity 建立urp项目并使用后处理技术的方法

    Unity URP是Unity官方提供的轻量级渲染管线,它旨在为移动平台和低端PC提供高效的渲染解决方案。相较于传统的渲染管线,URP使用了一些新的技术和算法来提高渲染效率和质量。URP还支持可编程渲染管线(Shader Graph)和更加直观的后处理效果。在使用URP时,可以通过调整一些参

    2024年02月16日
    浏览(49)
  • 【URP趟坑】Unity在URP中使用RenderTexture在UI中渲染带透明相机背景的PostProcessing场景

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近有个需求,需要使用Unity的URP通用管线来开发项目,其中有个场景是需要在UI中显示动态的角色模型,而且背景是透明的。初闻这个需求感觉挺简单的,普通管线下使用Rendertexture输出相机视角的内容

    2024年02月04日
    浏览(44)
  • 《Unity的URP项目中使用自定义shader导致材质消失的解决办法》

            在Unity中使用URP时,会有需求使用自定义的一些shader来实现特殊效果,这时如果我们直接使用新建材质与无光照着色器(Unlit shader),可能会发生一个对于新手而言意料之外的问题—— 物体!消失了!         打开你正在使用的的 通用渲染器(Universal Rendere

    2024年02月06日
    浏览(81)
  • Unity——URP相机详解

    2021版本URP项目下的相机,一般新建一个相机有如下组件 1:Render Type( 渲染类型 ) 有Base和Overlay两种选项,默认是Base选项         Base:主相机使用该种渲染方式,负责渲染场景中的主要图形元素         Overlay(叠加):使用了Oveylay的相机会把它渲染出的图形叠加到其他相机之上

    2024年02月05日
    浏览(53)
  • Unity URP下阴影锯齿

            在Unity开发的URP项目中出现阴影有明显锯齿。如下图所示:         并且在主光源的Shadow Type已经是Soft Shadows模式了。         阴影出现锯齿说明阴影质量不高,所以要先找到URP Asset文件进行阴影质量参数的设置。 1.打开PlayerSetting找到 Graphics(也可以Quality),然

    2024年01月23日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包