当前位置: 首页 > news >正文

URP - 深度图

在unity中开启深度图,这样才能在Shader中引用_CameraDepthTexture

如何查看画面中的深度信息?

半透明物体不会渲染深度信息,数值小于2500的为不透明渲染队列,数值大于2500为半透明渲染队列

所以想要一个物体的深度信息不出现在深度图中,就可以将该物体的Shader的渲染队列改为 "Queue" = "Transparent"


如何在Shader中应用深度图?

在Pass中声明深度图:

TEXTURE2D(_CameraDepthTexture);

SAMPLER(sampler_CameraDepthTexture);

使用面片模型在屏幕空间中的坐标来采样深度图(因为深度图生成是基于屏幕)

//i.positionCS为屏幕映射后的值(也就是屏幕空间下的坐标),_ScreenParams.xy分别代表屏幕的宽高

//i.positionCS/_ScreenParams.xy的作用就是将模型的坐标转换到屏幕坐标系下并映射到0-1的范围内
float2 uv = i.positionCS/_ScreenParams.xy;

//此时uv代表模型在屏幕空间下的坐标值,用此值来采样深度图(此时为非线性的深度图)
float4 depthTex = SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,uv);

//因为深度是一个非线性的值域,所以需要将此深度图转换到一个线性的空间(并将值映射到0-1的范围内)
float depth = Linear01Depth(depthTex,_ZBufferParams);

Shader"unity/DepthShader"
{Properties{_MainTex("MainTex",2D)="white"{}}SubShader{Tags{"RenderPipeline"="UniversialPipeline""RenderType"="Transparent""Queue"="Transparent"}ZWrite OffPass{HLSLPROGRAM#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"#pragma vertex vert#pragma fragment fragTEXTURE2D(_MainTex);#define sampler_MainTex samplerState_Linear_RepeatSAMPLER(sampler_MainTex);TEXTURE2D(_CameraDepthTexture);SAMPLER(sampler_CameraDepthTexture);struct Attributes{float4 positionOS : POSITION;float2 uv : TEXCOORD;};struct Varyings{float4 positionCS : SV_POSITION;float2 uv : TEXCOORD;float4 screenPos : TEXCOORD1;};Varyings vert(Attributes v){Varyings o = (Varyings)0;o.positionCS = TransformObjectToHClip(v.positionOS);o.uv = v.uv;// o.screenPos = ComputeScreenPos(o.positionCS);return o;}float4 frag(Varyings i):SV_Target{// float2 uv = i.screenPos.xy/i.screenPos.w;//i.positionCS为屏幕映射后的值(也就是屏幕空间下的坐标),_ScreenParams.xy分别代表屏幕的宽高//i.positionCS/_ScreenParams.xy的作用就是将模型的坐标转换到屏幕坐标系下并映射到0-1的范围内float2 uv = i.positionCS/_ScreenParams.xy;float4 mainTex = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);//此时uv代表模型在屏幕空间下的坐标值,用此值来采样深度图(此时为非线性的深度图)float4 depthTex = SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,uv);//因为深度是一个非线性的值域,所以需要将此深度图转换到一个线性的空间(并将值映射到0-1的范围内)float depth = Linear01Depth(depthTex,_ZBufferParams);return depth;}ENDHLSL}}}

相关文章:

  • CSS网格布局
  • UE5 ML机械学习肌肉反应与布料反应
  • 大疆三方云平台部署
  • Linux grep 命令详解及示例大全
  • 多线程“CPU 飙高”问题:如何确保配置的线程数与CPU核数匹配(Java、GoLang、Python )中的最佳实践解决方案
  • 可检查异常与不可检查异常
  • suna工具调用可视化界面实现原理分析(三)
  • 【神经网络、Transformer及模型微调】
  • Windows11下ESP-IDF开发环境搭建【基于Cursor/VS Code插件】
  • 2025-05-06 滑动窗口最大值
  • 逐次逼近式A/D转换器
  • 1、PLC控制面板 - /自动化与控制组件/plc-control-panel
  • AI-02a5a2.神经网络的学习
  • C# 实现PLC数据自动化定时采集与存储(无需界面,自动化运行)
  • 2021-10-31 C++求一个千位和十位数字之和为10,百位个位之积为12的四位数
  • 针对面试-redis篇
  • mybatis 的多表查询
  • 【SpringBoot3】idea找不到log符号
  • 开源与商业:图形化编程工具的博弈与共生
  • 2025年游戏行业DDoS攻防指南:智能防御体系构建与实战策略
  • 巴基斯坦:印度向巴3处地点发射导弹
  • 金价大反攻,国内金饰价格涨回千元,能否重返巅峰?
  • 默茨在德国联邦议院第一轮投票中未能当选总理
  • “五一”假期出入境人数达1089.6万人次,同比增长28.7%
  • 中海油高管调整:刘永杰、刘小刚任副总裁
  • 人民日报:创新成势、澎湃向前,中国科技创新突围的密码与担当