当前位置: 首页 > 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}}}

http://www.xdnf.cn/news/308197.html

相关文章:

  • 多模态大语言模型arxiv论文略读(六十一)
  • 码蹄集——直线切平面、圆切平面
  • postgresql 创建、移出数据保留策略
  • WiFi那些事儿(八)——802.11n
  • 基于Anaconda的Pycharm环境配置
  • 【IP101】图像处理进阶:从直方图均衡化到伽马变换,全面掌握图像增强技术
  • 游戏的TypeScript(6)TypeScript的元编程
  • 高级java每日一道面试题-2025年5月03日-基础篇[反射篇-编码]-使用反射创建`java.util.Date`对象,并调用其无参构造方法。
  • 【PPT制作利器】DeepSeek + Kimi生成一个初始的PPT文件
  • 安全不止一层:多因素认证的实现与管理指南
  • 荣耀A8互动娱乐组件部署实录(第1部分:服务端环境搭建)
  • 学习人工智能开发的详细指南
  • Kubernetes弹性伸缩:让应用自动应对流量洪峰与低谷
  • 如何在 Vue3 中更好地使用 Typescript
  • POI创建Excel文件
  • ubantu安装CUDA
  • uniapp开发11-v-for动态渲染list列表数据
  • 26届秋招收割offer指南
  • 基于SpringBoot网上书店的设计与实现
  • Python爬虫+代理IP+Header伪装:高效采集亚马逊数据
  • 处理 Clickhouse 内存溢出
  • 模态编码器
  • 基于SpringBoot + Vue 的作业管理系统
  • 生成式 AI:从工具革命到智能体觉醒,2025 年的质变与突破
  • 在线网页代理:从入门到精通
  • DolphinScheduler-3.2.0集群部署教程
  • 408考研逐题详解:2009年第9题
  • NHDEEP档案管理系统功能介绍
  • ClickHouse的基本操作说明
  • 链表的面试题3找出中间节点