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

server/2024/9/22 13:27:46/

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"
}

http://www.ppmy.cn/server/105108.html

相关文章

【操作系统】10.虚拟内存管理有什么不同?

2.虚拟内存管理有什么不同? 2.1 虚拟内存的基本概念 虚拟内存的概念 具有请求调入和置换功能,从逻辑上对内存容量加以扩充的一种存储器系统 局部性原理 时间局部性 空间局部性 虚拟内存的特征 多次性 对换性 虚拟性 2.1.1 虚拟内存的实现 请求分页存储管…

mac苹果电脑搭建Python开发环境

公司的新电脑上要搭建Python的开发环境,由于给的是mac电脑,所以需要重新搭建python环境。 这里我首先考虑的还是miniconda。 由于官网下载太慢了,所以我选择从清华源下载:https://mirrors.tuna.tsinghua.edu.cn/anaconda/minico…

docker-compose.yml配置

文章目录 docker-compose.yml配置常用命令docker-compose up 与docker-compose start ,docker start的区别docker-compose.yml说明docker compose执行顺序命名卷和挂载卷yml 和 yaml 区别 docker-compose.yml配置 常用命令 docker --version #查看版本docker-comp…

【最长上升子序列】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1010; int a[N], f[N]; int main() {int n;cin >> n;for(int i 1; i < n; i) cin >> a[i];int res 0;for(int i 1; i < n; i){f[i] 1;for(int j 1; j < i; j){if(a[j] &…

冷却液温度传感器检测诊断

检测发动机冷却液温度&#xff0c;向ECU输入温度信号&#xff0c;作为燃油喷射和点火正时的修正信号&#xff0c;同时也是其他控制系统的控制信号。 冷却液温度传感器安装位置 冷却液温度传感器&#xff08;俗称水温传感器&#xff09;一般安装在缸体水道上&#xff0c;缸盖水…

【AI学习】LLaMA模型的微调成本有几何?

在前面文章《LLaMA 系列模型的进化&#xff08;二&#xff09;》中提到了Stanford Alpaca模型。 Stanford Alpaca 基于LLaMA (7B) 进行微调&#xff0c;通过使用 Self-Instruct 方法借助大语言模型进行自动化的指令生成&#xff0c;Stanford Alpaca 生成了 52K 条指令遵循样例数…

电子克隆方法的优缺点有哪些?

电子克隆方法的优缺点有哪些&#xff1f; 李升伟 电子克隆方法的优点&#xff1a; 1. 高效性 - 能够快速从大量的生物信息数据中筛选和分析&#xff0c;大大缩短了新基因发现的时间。 2. 成本低 - 相比传统的实验克隆方法&#xff0c;不需要大量的实验试剂和设备&#…

二十三设计模式速记

文字版 Java设计模式通常被分为三大类&#xff1a;创建型模式&#xff08;Creational Patterns&#xff09;、结构型模式&#xff08;Structural Patterns&#xff09;和行为型模式&#xff08;Behavioral Patterns&#xff09;。每种类型包含若干种具体的设计模式。 创建型模…