Unity URP 如何实现遮挡显示 (全流程教程)

news/2024/10/19 7:26:43/

嗨~~!,熊猫老师又来了 ,这次为大家分享项目中非常实用的一个技术点:遮挡显示。

 老规矩,上才艺:

 

实现原理 :对模型渲染两次。

 第一次: 正常渲染物体,深度测试不通过的情况下不会写入模板测试数据,以此来判断遮挡或者没有遮挡部分。
第二次:在后处理之前进行渲染(后处理渲染之后是无法获取模板数据),深度测试不通过,无法渲染相关信息。 

具体实现方案

   1:在原物体(角色)shader 中  写入深度测试模板:

         代码如下:

     

Stencil{Ref 2  //写入模板,数值为2 Comp Always   // Gpu 执行所有的像素模板测试Pass Replace  //只要深度测试没有通过,值设成2Fail Replace	//只要深度测试没有通过,值设成2}

    2:创建边缘光效果shader

   比较简单,一个Fresnel 效果实现。

 

  half fresnel = saturate(1.0 - dot(normalize(i.normalWS), normalize(i.viewDir));fresnel = pow(fresnel, _Power);

     

2:创建renderFeature 

     如图 一样的操作就可以了

 1:Project Settings ———> Quality

  

双击进入后:

再双击进入后:

创建一个renderFeature 

然后照搬我的就可以了:

 

注意:Layer Mask 需要和物件(角色)保持同一个层里面

 

为了方便大家测试,我提供了我的两个shader代码:

物件原生shader(角色)

Shader "XiongMaoWuDao/Player"
{Properties{[MainColor] _BaseColor("BaseColor", Color) = (1,1,1,1)[MainTexture] _BaseMap("BaseMap", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalRenderPipeline" "Queue"="Geometry"}Stencil{Ref 2Comp AlwaysPass ReplaceFail Replace	}Pass{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{float2 uv           : TEXCOORD0;float4 positionHCS  : SV_POSITION;};TEXTURE2D(_BaseMap);SAMPLER(sampler_BaseMap);CBUFFER_START(UnityPerMaterial)float4 _BaseMap_ST;half4 _BaseColor;CBUFFER_ENDVaryings vert(Attributes IN){Varyings OUT;OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);return OUT;}half4 frag(Varyings IN) : SV_Target{return SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv) * _BaseColor;}ENDHLSL}}
}

遮挡后的高亮显示shader :

Shader "XiongMaoWuDao/PlayerLine"
{Properties{_FresnelColor ("Fresnel Color", Color) = (1, 1, 1, 1)        _Power("Power", Range(0.0, 10.0)) = 1_FresnelIntensity("FresnelIntensity", Range(0.0, 5.0)) = 1       _Cull ("Cull", Int) = 2}SubShader{Tags { "RenderType"="Transparent" "RenderPipeline"="UniversalRenderPipeline" "Queue"="Transparent"}Pass{Name "XiongMaoWuDao"Cull[_Cull]ZTest AlwaysBlend SrcAlpha OneMinusSrcAlphaHLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"struct Attributes{float4 positionOS : POSITION;half3 normalOS : NORMAL;};struct Varyings{float4 positionCS : SV_POSITION;half3 normalWS : TEXCOORD0;half3 viewDir :TEXCOORD1 ;};CBUFFER_START(UnityPerMaterial)half4 _FresnelColor;half _Power;half _FresnelIntensity;CBUFFER_END//菲尼尔反射half XionmgMaoWuDao_Fresnel( half3 normal ,half3 viewDir ,half power){//菲尼尔公式: (1-dot (v,n))^power ;return pow( 1.0- saturate(dot(normal,viewDir).x) ,power);}Varyings vert(Attributes v){Varyings o;o.positionCS = TransformObjectToHClip(v.positionOS.xyz);           o.normalWS = TransformObjectToWorldNormal (v.normalOS );float3 positionWS = TransformObjectToWorld(v.positionOS.xyz);o.viewDir =GetWorldSpaceViewDir(positionWS);return o;}half4 frag(Varyings i) : SV_Target{half3 normalWS = normalize (i.normalWS);half3 viewDir  =  normalize (i.viewDir);half fresnel = XionmgMaoWuDao_Fresnel(normalWS,viewDir,_Power);                    half4 color = _FresnelColor * _FresnelIntensity;return half4(color.rgb, fresnel);}ENDHLSL}}
}


http://www.ppmy.cn/news/1538822.html

相关文章

tensorflow + pygame 手写数字识别的小游戏

起因, 目的: 很久之前,一个客户的作业,我帮忙写的。 今天删项目,觉得比较简洁,发出来给大家看看。 效果图: 1. 训练模型的代码 import sys import tensorflow as tf# Use MNIST handwriting dataset mnist tf.kera…

python xml的读取和写入

import xml.etree.ElementTree as ET from xml.dom import minidom# 读取XML文档 tree ET.parse("./xml_3/z_20240827_001.xml") root tree.getroot() # 获取size元素 size_find_0 root.find("size") # 获取width子元素 size_w size_find_0.find("…

List、Map、Set 三个接口存取元素时,各有什么特点

List、Map、Set是Java集合框架中的三个核心接口,它们在存取元素时各自具有独特的特点。以下是对这三个接口存取元素特点的详细分析: List接口 有序性: List中的元素是有序的,它们按照插入的顺序进行排列。 可重复性&#xff1a…

Mac上功能全面,免费好用的解压缩工具

在日常使用Mac的过程中,相信不少朋友都有解压缩需求,目前存在的解压缩软件可以说各种各样,但是有的收费,有的解压速度慢,有的解压类型不全,各有优缺点,挑选起来眼花缭乱,挑来挑去也没…

taozige/Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码

云快充协议云快充1.5协议云快充1.6云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩协议云快充源码 介绍 云快充协议云快充1.5协议云快充1.6云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩协议云快充源码 软件架构 1、提供云快充底层桩直连协…

电脑无线网wifi和有线网同时使用(内网+外网同时使用)

一、要求 我这里以无线网wifi为外网,有线网卡为内网为例: 一、基本信息 无线wifi(外网):ip是192.168.179.235,网关是192.168.179.95有线网(内网):ip是192.168.10.25&…

前端 + Nginx + 后端架构的无感升级方案

一、前端无感升级 构建新的前端包 使用 Webpack、Vite 等工具进行打包,生成带有版本号或哈希值的静态文件名。确保 index.html 引用最新的静态资源文件(例如 app.js?versionabc123)。 上传静态资源到服务器 将打包后的前端静态资源上传到 Ng…

并查集的实现(朴素版)

这是C算法基础-数据结构专栏的第二十九篇文章,专栏详情请见此处。 由于作者即将参加CSP,所以到比赛结束前将不再发表文章! 引入 并查集是一种可以快速合并查找集合的一种数据结构,这次我们将通过三道题来详细讲解并查集&#xff…