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

Unity中URP下开启和使用深度图

文章目录

  • 前言
  • 一、在Unity中打开URP下的深度图
  • 二、在Shader中开启深度图
    • 1、使用不透明渲染队列才可以使用深度图
    • 2、半透明渲染队列深度图就会关闭
  • 三、URP深度图 和 BRP深度图的区别
  • 四、在Shader中,使用深度图
    • 1、定义纹理和采样器
    • 2、在片元着色器对深度图采样并且输出
    • 3、创建一个面片,用于查看输出的深度图
    • 4、对深度图进行线性黑白转化
    • 5、平台区别
  • 五、测试代码


前言

URP下的深度图、深度图记录的就是物体离摄像机的远近值。

这是深度图的作用:

  • 渲染深度图
  • 相交高亮
  • 能量场
  • 全局雾效
  • 扫描线
  • 水淹
  • 垂直雾效
  • 边缘检测
  • 运动模糊
  • 景深

我们在这篇文章中,了解一下怎么开启URP下的深度图。


一、在Unity中打开URP下的深度图

  • 在之前创建的URP设置文件中,打开Depth Texture
    在这里插入图片描述

二、在Shader中开启深度图

  • 我们使用一个胶囊体来测试 和 一个最简URP模板来测试

1、使用不透明渲染队列才可以使用深度图

  • Render Queue < 2500 时才可以使用深度图

Tags{“Queue”=“Geometry}”

  • 开启Zwrite

Zwrite On

在这里插入图片描述
在这里插入图片描述

2、半透明渲染队列深度图就会关闭

  • Render Queue > 2500 时(半透明渲染队列),会关闭深度图

Tags{“Queue”=“Transparent}”

  • 关闭Zwrite

Zwrite Off

在这里插入图片描述


三、URP深度图 和 BRP深度图的区别

  • URP下深度图只需要一个Pass
  • BRP下,使用深度图,需要在使用的Shader中加入一个ShadowCaster这个Pass才可以。比较消耗性能。

四、在Shader中,使用深度图

  • 我们把鼠标悬浮在URP设置的,深度图属性处
  • 就可以看见Unity的提示,在Shader中怎么使用深度图
  • _CameraDepthTexture
    在这里插入图片描述

1、定义纹理和采样器

TEXTURE2D(_CameraDepthTexture);SAMPLER(sampler_CameraDepthTexture);

2、在片元着色器对深度图采样并且输出

float4 cameraDepthTex = SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,i.uv);
return cameraDepthTex;

3、创建一个面片,用于查看输出的深度图

  • 可以调节对比度让深度图显示更加明显
    在这里插入图片描述

4、对深度图进行线性黑白转化

float depthTex = Linear01Depth(cameraDepthTex,_ZBufferParams);

在这里插入图片描述

5、平台区别

  • OpenGL下:
    在这里插入图片描述

  • DirectX下(显示反着):
    在这里插入图片描述


五、测试代码

Shader "MyShader/URP/P4_1"
{Properties {_Color("Color",Color) = (0,0,0,0)_MainTex("MainTex",2D) = "white"{}}SubShader{Tags{//告诉引擎,该Shader只用于 URP 渲染管线"RenderPipeline"="UniversalPipeline"//渲染类型"RenderType"="Transparent"//渲染队列"Queue"="Transparent"}//Blend One OneZWrite OffPass{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/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);//struct appdata//顶点着色器的输入struct Attributes{float3 positionOS : POSITION;float2 uv : TEXCOORD0;};//struct v2f//片元着色器的输入struct Varyings{float4 positionCS : SV_POSITION;float2 uv : TEXCOORD0;};//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);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;float4 cameraDepthTex = SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,i.uv);float depthTex = Linear01Depth(cameraDepthTex,_ZBufferParams);return depthTex;}ENDHLSL}}FallBack "Hidden/Shader Graph/FallbackError"
}

相关文章:

  • 基于ssm社区医疗保健监控系统+vue论文
  • CNCF之CoreDNS
  • 人工智能在库存管理中的应用
  • 计算机毕业设计----JSP+servlet鲜花销售商城管理系统
  • 开源C语言库Melon:用户态动态追踪与控制反馈
  • 简单易懂的PyTorch 损失函数:优化机器学习模型的关键
  • C++ 模板
  • pythroch abaconda 安装 cuda、版本确定、pytorch 安装
  • Java多线程并发篇----第七篇
  • 【期末不挂科-考前速过系列P4】单片机[接口与总线]——经典例题盘点(带图解析)(第四章:32题搞定基本指令例题))
  • 具备闭环思维的测试才更充分
  • 深入了解网络流量清洗--使用免费的雷池社区版进行防护
  • TortoiseSVN·文件锁定与清理
  • 20240110-Python实现读取当前文件夹下所有视频名称和时长并生成一张表
  • 达梦数据库 模式 研究
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • C++类中的特殊成员函数
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Odoo domain写法及运用
  • Puppeteer:浏览器控制器
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • session共享问题解决方案
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 排序算法之--选择排序
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 用 Swift 编写面向协议的视图
  • linux 淘宝开源监控工具tsar
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 移动端高清、多屏适配方案
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # C++之functional库用法整理
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (ibm)Java 语言的 XPath API
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (定时器/计数器)中断系统(详解与使用)
  • (过滤器)Filter和(监听器)listener
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (七)Java对象在Hibernate持久化层的状态
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (算法)Game
  • (算法)Travel Information Center
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 分布式技术比较
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /etc/fstab和/etc/mtab的区别
  • @RequestParam详解
  • @开发者,一文搞懂什么是 C# 计时器!