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

news2024/11/13 23:19:53

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 On
            ColorMask 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_END

            Varyings 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.coloradmin.cn/o/2068714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在ubuntu22.04上部署RagFlow一个深度文档理解的开源 RAG

RAGFlow 是一个基于深度文档理解的开源 RAG(Retrieval-Augmented Generation)引擎。它为任何规模的企业提供简化的 RAG 工作流程,结合 LLM(大型语言模型)以提供真实的问答功能,并由来自各种复杂格式数据的有…

微服务——远程调用

为什么需要远程调用? 在微服务架构中,每个服务都是独立部署和运行的,它们之间需要相互协作以完成复杂的业务逻辑。因此,远程调用成为微服务之间通信的主要方式。通过远程调用,一个服务可以请求另一个服务执行某些操作或…

Ubuntu 22安装和配置PyCharm详细教程(图文详解)

摘要:本文提供了在 Ubuntu 22 上通过官方 .tar.gz 文件安装 PyCharm 的详细教程。包括从 JetBrains 官方网站下载适合的 PyCharm 版本(Community 或 Professional),在终端中解压并将其移动到 /opt 目录,配置适当的权限…

探索《旅行青蛙》:在Scratch上重温温暖与治愈的旅程

Scratch青蛙跳一跳(回家版)- 趣味跳跃挑战,轻松助力青蛙回家之旅-小虎鲸Scratch资源站 在这个快节奏的世界中,治愈系游戏《旅行青蛙》以其独特的魅力吸引了无数玩家。这个游戏不仅让我们能够体验到与青蛙一起旅行的温暖与宁静&…

【运筹学】【数据结构】【经典算法】最小生成树问题及贪心算法设计

1 知识回顾 我们已经讲过最小生成树问题的基础知识,我们现在想要利用贪心算法解决该问题。我们再来回顾一下最小生成树问题和贪心算法的基础知识。 最小生成树问题就是从某个图中找出总权重最小的生成树。 贪心算法是一种算法设计范式,每一步都选…

芯片后端之 PT 使用 report_timing 产生报告 之 -input_pins 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -include_hierarchical_pins 选项。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max -include_hierarchical_pins 我们使用命…

我们再次陷入软件危机

裁员、裁员、裁员,似乎永无止境。创业公司融资处于 5 年来最低水平。除了整体经济挑战之外,人工智能取代软件工作的担忧也即将出现。每天的科技新闻读起来就像世界末日的故事。 这又是软件开发的终结吗? 作为一名在互联网泡沫破灭后开始从事软…

【数据结构2】链表(使用头插法和尾插法创建链表)、链表的插入和删除、双链表节点的插入、双链表节点的删除

1 链表 1.2 使用头插法和尾插法创建链表 2 链表的插入和删除 3 双链表 3.1 双链表节点的插入 3.2 双链表节点的删除 1 链表 链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个节点的指针next。 通过节点之间的相互连接最终串联成一个链…

【qt】自定义信号

我们在上篇中,服务器收到的消息是由线程类去处理的,消息在线程类中,传不到widget中的ui中去,如果我们要在界面显示客户端的消息,必须通过自定义信号. 1.构建信号 当线程收到信息,就会被填充在ba中&#xf…

Robot Operating System——自定义Service/Client通信消息结构

大纲 初始化环境生成自定义服务的工程创建包自定义消息package.xml完整文件 CMakeLists.txt完整文件 编译注册 使用自定义服务的工程创建包代码CMakeLists.txt编译运行 工程地址参考资料 在《Robot Operating System——自定义订阅/发布的消息结构》一文中,我们讲解…

Linux | 文件系统进阶:Inode与软硬链接艺术剖析

当时共我赏花人,点检如今无一半。 - 《木兰花》(晏殊) 2024.8.24 目录 1. 文件系统的基本概念 1.1 ls -l命令查看目录信息 1.2 stat命令查看具体文件的详细信息 1.3 inode ext2文件系统的主要组成部分: 例子:创建main.c文件 文件的创建步骤&a…

leetcode:2520. 统计能整除数字的位数(python3解法)

难度:简单 给你一个整数 num ,返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 ,则认为整数 val 可以整除 nums 。 示例 1: 输入:num 7 输出:1 解释:7 被自己整除,因…

继续修改原神角色数据列表

<!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神4.8版本获得角色数据表</title> </…

【STM32】一些外设通用内容

在学习各种外设的过程中&#xff0c;发现外设有一些通用的东西可以总结一下&#xff0c;后面发现再继续更新。图来源于正点原子的学习视频和PPT。 目录 1 外设的时钟的开启 2 外设初始化的回调机制 3 外设的中断服务函数 4 HAL库中断回调机制 5 函数的常见…

SpringCache源码解析(一)

一、springCache如何实现自动装配 SpringBoot 确实是通过 spring.factories 文件实现自动配置的。Spring Cache 也是遵循这一机制来实现自动装配的。 具体来说,Spring Cache 的自动装配是通过 org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration 这个类来…

文件树控件开发

文件树控件和获取驱动信息功能 然后添加上查看文件信息的按钮 双击这个按钮添加上如下代码 void CRemoteClientDlg::OnBnClickedBtnFileinfo() {int ret SendCommandPacket(1);if (ret -1) {AfxMessageBox(_T("命令处理失败!!!"));return;}ClientSocket* pClient…

c++每日练习记录5-(链表的结尾指向nullptr)

解题方法&#xff1a;双指针法 ListNode *partition(ListNode *head, int x){ListNode *head1 new ListNode(0);ListNode *head2 head1;ListNode *head3 new ListNode(0);ListNode *head4 head3;while (head! nullptr){if (head->val < x){head1->next head;head…

成品CNC外壳的巧妙使用

有些时候10块买一个CNC外壳&#xff0c;钻个孔&#xff0c;比单独的3D打印更能提升板子的档次感&#xff1a; 这个CNC是真的好看&#xff0c;再加上3D打印辅助设计&#xff0c;堪称精美&#xff1a;

k8s安装Metabase开源报表系统

metabase是什么&#xff1f; metabase是一款开源的简易但强大同时又无缝兼容大数据和传统数据库的分析工具&#xff0c;帮助公司每一个人对企业数据的学习挖掘&#xff0c;进而达到更好的数据化运营和决策。 Metabase is a simple and powerful analytics tool which lets anyo…

热血传奇1.76版本完美仿官单机版安装教程+GM工具+无需虚拟机

今天给大家带来一款单机游戏的架设&#xff1a;热血传奇1.76版本完美仿官。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;…