Unity URP Shader 修改深度让人物不再被地面遮挡

2024-08-24 13:44

本文主要是介绍Unity URP Shader 修改深度让人物不再被地面遮挡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Unity URP Shader 修改深度让人物不再被地面遮挡

  • 前言
  • 项目
    • 场景布置
    • 代码编写

前言

遇到一个小问题,人物总是被XY平面的地面遮挡,于是在Shader中改一下深度输出,这样地面再也不会挡住人物了。
遮挡示意

项目

场景布置

将人物放到XY平面的后面

人物放到XY平面的后面
配置Shader参数
配置参数

代码编写

Shader "Unlit/DepTest"
{Properties{[MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)[MainTexture] _MainTex("Main Texture", 2D) = "white" {}_DepthBias("Depth Bias", Float) = 0.01 // 深度偏移,确保在XY平面之前渲染}SubShader{Tags { "RenderType" = "Transparent" "RenderQueue"="Transparent" "RenderPipeline" = "UniversalPipeline" }Pass{Name "UnlitPass"Tags { "LightMode" = "UniversalForward" }Cull Off  // 双面渲染Blend SrcAlpha OneMinusSrcAlpha // 混合模式,支持透明度ZTest LEqual // 深度测试,确保当前像素深度小于等于之前的像素才渲染// ZTest Always  // 深度测试设置为Always,确保总是渲染ZWrite Off  // 关闭深度写入,防止影响其他物体的深度排序// ZWrite OnColorMask RGBA // 允许写入颜色缓冲区的所有通道 (红、绿、蓝、透明)HLSLPROGRAM#pragma vertex vert // 定义顶点着色器方法名称#pragma fragment frag // 定义片元着色器方法名称#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"struct Attributes{float4 positionOS   : POSITION; // 顶点位置,模型空间坐标float2 uv           : TEXCOORD0; // 顶点纹理坐标};struct Varyings{float4 positionHCS  : SV_POSITION; // 输出到片元着色器的顶点位置,裁剪空间坐标float2 uv           : TEXCOORD0; // 传递给片元着色器的纹理坐标float depth         : TEXCOORD1; // 存储深度值,供片元着色器使用};TEXTURE2D(_MainTex);SAMPLER(sampler_MainTex);CBUFFER_START(UnityPerMaterial)half4 _BaseColor;float4 _MainTex_ST;float _DepthBias; // 深度偏移量CBUFFER_ENDVaryings vert(Attributes IN){Varyings OUT;// 获取对象在世界空间中的位置float4 worldPosition = mul(GetObjectToWorldMatrix(), IN.positionOS);// 将世界空间坐标转换为裁剪空间坐标OUT.positionHCS = TransformWorldToHClip(worldPosition);// 传递纹理坐标OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);// 计算并存储深度值OUT.depth = OUT.positionHCS.z / OUT.positionHCS.w;return OUT;}struct FragmentOutput{half4 color : SV_Target; // 最终颜色输出float depth : SV_Depth; // 深度输出};FragmentOutput frag(Varyings IN){FragmentOutput OUT;OUT.color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv) * _BaseColor;OUT.depth = IN.depth - _DepthBias; // 深度偏移return OUT;}ENDHLSL}}FallBack "Unlit/Texture"
}

这篇关于Unity URP Shader 修改深度让人物不再被地面遮挡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102648

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

Mysql8.0修改配置文件my.ini的坑及解决

《Mysql8.0修改配置文件my.ini的坑及解决》使用记事本直接编辑my.ini文件保存后,可能会导致MySQL无法启动,因为MySQL会以ANSI编码读取该文件,解决方法是使用Notepad++... 目录Myhttp://www.chinasem.cnsql8.0修改配置文件my.ini的坑出现的问题

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一