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

Unity URP无光照下Shadow 制作 <二> 合批处理

  闲谈 

       相信大家在日常工作中发现了一个问题 , urp下虽然可以做到3个Pass 去写我们想要的效果,但是,不能合批(不能合批,那不是我们CPU要干冒烟~!)

      好家伙,熊猫老师的偏方来了 ,教大家如何在URP渲染管线下做到多pass也能合批,干货满满。  

一:合并公共预设 

        方便我们多Pass状态下 ,更快的实现,也能让代码更加专业。

如图所示: 

     我们在Subshader下用 HLSLINCLUDE  和 ENDHLSL 去实现。

 其次 咱们在第二个Pass  “影子渲染pass”里面添加Tags  并对LightMode 复制渲染层为 “XiongMaoWuDao”

如图所示:

    

   Pass{Name "XiongMaoWuDao"Tags{"LightMode" = "XiongMaoWuDao"}

二:URP  Add Renderer Feature 

如图步骤:

 

添加Renderer Feature  设置如下:

   

好了,现在我们来看看多物件下影子Pass是否合批。

上才艺:

  

Shader "XiongMaoWuDao/Shadow"
{Properties{[MainColor] _BaseColor("BaseColor", Color) = (1,1,1,1)[MainTexture] _BaseMap("BaseMap", 2D) = "white" {}//影子处理//影子淡出处理_ShadowColor("Color", Color) = (0, 0, 0, 1)_LightDir ("Light Direction", Vector) = (0, 1, 0, 0)_PlaneY ("Plane Height", Float) = 0	_ShadowFalloff ("ShadowFalloff ",Range (0,1)) = 0.5}SubShader{Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" "Queue" = "Opaque"}HLSLINCLUDE#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"TEXTURE2D(_BaseMap);SAMPLER(sampler_BaseMap);CBUFFER_START(UnityPerMaterial)float4 _BaseMap_ST;half4 _BaseColor;float4 _ShadowColor;half3 _LightDir;half _PlaneY;half _ShadowFalloff;CBUFFER_ENDENDHLSLpass {Name "Forward"Tags {}HLSLPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_instancingstruct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float2 uv : TEXCOORD0;   float4 vertex : SV_POSITION;UNITY_VERTEX_INPUT_INSTANCE_ID};v2f vert (appdata v){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_TRANSFER_INSTANCE_ID(v, o);o.vertex = TransformObjectToHClip(v.vertex.xyz);;o.uv = TRANSFORM_TEX(v.uv, _BaseMap);return o;}half4 frag (v2f i) : SV_Target{UNITY_SETUP_INSTANCE_ID(i);return SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, i.uv) * _BaseColor;}ENDHLSL}Pass{Name "XiongMaoWuDao"Tags{"LightMode" = "XiongMaoWuDao"}//添加模板缓冲区是解决影子重叠问题(降低透明度就能发现)Stencil{Ref 1  //和模板缓冲区的值进行比较。Comp NotEqual   //比较函数, 决定参考值和模板缓冲区的值如何比较 (是否相等) NotEqualPass Replace   //模板测试通过时候的操作 。  Replace 模板缓冲区中的值设为参考值。ReplaceFail Keep    //模板测试失败时候的操作 。    keep是保持缓冲区当前的值//ZFail Keep  }Blend SrcAlpha OneMinusSrcAlpha//	ZWrite off//     Offset -1 , 0HLSLPROGRAM#pragma vertex vert#pragma fragment fragstruct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;   float4 vertex : SV_POSITION;float4 color : COLOR;};//阴影方向计算。float3 PlanarShadowPos(float3 posWS){float3 L = normalize(_LightDir);float3 N = float3(0, 1, 0);float d1 = dot(L, N);float d2 = posWS.y - _PlaneY;// 阴影坐标沿法线方向偏移一点,防止与平面重叠时出现z-fighting的问题float3 offsetByNormal = N * 0.001;return posWS - L * (d2 / d1) + offsetByNormal;}v2f vert (appdata v){v2f o;// 顶点坐标,转世界坐标float3 posWS = TransformObjectToWorld(v.vertex.xyz);// 世界顶点坐标转为平面坐标posWS = PlanarShadowPos(posWS);o.vertex = TransformWorldToHClip(posWS);o.uv =v.uv;         //得到中心点世界坐标float3 center = float3(unity_ObjectToWorld[0].w,  _PlaneY, unity_ObjectToWorld[2].w);//计算阴影衰减float falloff = 1 - saturate(distance(posWS, center) * _ShadowFalloff);o.color = _ShadowColor;o.color.a *=falloff;return o;}half4 frag (v2f i) : SV_Target{return i.color;}ENDHLSL}}}

能看见我在场景中做了4个材质球且用了不同的贴图,但是  能看见第一个pass对颜色渲染已经合批成一个了(除了地面用了默认的材质球外,忽略)。 第二个Pass影子也全部合并成一个渲染层渲染,完美解决问题。 鼓掌~~~!

相关文章:

Unity URP无光照下Shadow 制作 <二> 合批处理

闲谈 相信大家在日常工作中发现了一个问题 , urp下虽然可以做到3个Pass 去写我们想要的效果,但是,不能合批(不能合批,那不是我们CPU要干冒烟~!) 好家伙,熊猫老师的偏方来了 &#x…...

微乐校园pf

TOC springboot451微乐校园pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这…...

文件其他相关函数

symlink 链接文件: file.txt -> hello.c 软链接文件、符号链接文件 硬链接文件 命令行:ln -s 123 softlink 快捷方式 int symlink(const char *oldpath, const char *newpath); 功能: 创建一个链接向oldpath文件的新符号链接文件 参数: oldpath:被链接向…...

SQLALchemy ORM 的关联关系之 ORM 中的多对多

SQLALchemy ORM 的关联关系之 ORM 中的多对多 场景示例实现多对多关系定义模型插入和查询数据总结在 SQLAlchemy ORM 中,多对多(Many-to-Many)关联关系是一种常见的关系类型,它表示两个表中的行可以相互关联,即一个表中的多行可以与另一个表中的多行相关联。为了实现这种关…...

sdkman install慢,采用squid代理

(1)A机器,IP:yy.yy.yy.yy 安装squid yum install squidvi /etc/squid/squid.confacl allowed_ip src xx.xx.xx.xx http_access allow allowed_ip http_access deny allsystemctl restart squid 开放3128端口 (2)B机器,IP:xx.xx.xx.xx, export http_proxyhttp://y…...

实时监控Windows服务器:使用Prometheus和Grafana的终极方案

视频指南 【1】快速上手:在Windows系统上部署Prometheus与Grafana,实时监控性能指标 【2】快速上手:在Windows系统上部署Prometheus与Grafana,实时监控性能指标 1. 下载并安装 Prometheus 下载 Prometheus: 访问 Pro…...

【文科生能看懂的】牛顿二项式定理

牛顿二项式定理 简单的二项式整数次幂展开的结果中的规律结果中各项的指数结果中各项的系数 二项式定理 牛顿二项式定理就是用来求某个二项式的整数次幂的展开式的。 简单的二项式整数次幂 我们可以先从简单的情况开始,比如二项式 ( a b ) (ab) (ab)的整数次幂&a…...

Fly Catcher:通过监测恶意信号来检测飞机欺骗

Fly Catcher 的开发者 Angelina Tsuboi 是一名飞行员、网络安全研究员和发明家。 她决定着手一个将这三个不同兴趣结合起来的项目,以解决航空雷达系统的一个重大问题。 ADS-B 系统最初用于基本的飞机定位和跟踪,Tsuboi 对该系统的网络安全方面进行了深…...

计算机网络——HTTP协议详解(上)

一、HTTP协议简单介绍 1.1 什么是HTTP协议 HTTP(超文本传输协议)是一种用于在Web浏览器和Web服务器之间传输数据的应用层协议。它是一种无状态协议,即服务器不会保留与客户端的任何连接状态信息,每个请求都被视为一个独立的事务。…...

十九、中介者模式

文章目录 1 基本介绍2 案例2.1 Developer 抽象类2.2 FrontendDeveloper 类2.3 BackendDeveloper 类2.4 Mediator 接口2.5 ProjectManager 类2.6 Client 类2.7 Client 类的运行结果2.8 总结 3 各角色之间的关系3.1 角色3.1.1 Colleague ( 同事 )3.1.2 ConcreteColleague ( 具体的…...

编程参考 - 头文件中使用static inline

在Linux kernel的头文件中,经常使用static inline来声明一个函数。 比如include/linux/delay.h中, static inline void ssleep(unsigned int seconds) { msleep(seconds * 1000); } static Keyword * 范围限制: 当应用于函数或变量时&#…...

Uniapp使用antd组件库

组件库官网 https://www.antdv.com/docs/vue/introduce-cn 安装 在命令行终端输入 npm uni --save ant-design-vue配置 我这里用的是uniapp的vue3版本模板 在main.js里面引入 只要改下面带序号的地方即可 import App from ./App// #ifndef VUE3 import Vue from vue im…...

计算机毕业设计选题推荐-高校实验室管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

nest定义响应码message文本

需求 需要对接口的异常响应码,手动设置message文本!!! 例如:项目中使用multer中间件实现文件上传,multer设置了文件大小限制,该中间件校验文件时错误(文件超出)会自动响…...

Java | Leetcode Java题解之第342题4的幂

题目: 题解: class Solution {public boolean isPowerOfFour(int n) {return n > 0 && (n & (n - 1)) 0 && n % 3 1;} }...

【日常开发】java中一个list对象集合 将字段a为 大豆 小麦 玉米等元素放在最前面 并组成新集合

🎈边走、边悟🎈迟早会好 在Java中实现这个功能,可以使用Stream来筛选出符合条件的元素,将它们放在新集合的前面,同时保留其他元素在新集合的后面。以下是如何实现的代码示例: 代码示例: impo…...

C++ 设计模式——原型模式

原型模式 原型模式主要组成部分原型模式的使用步骤原型模式的 UML 图原型模式 UML 图解析优点和缺点适用场景总结 原型模式 原型(Prototype)模式是一种创建型模式。原型模式通过(原型对象)克隆出对个一模一样的对象。实际上,该模式与其说是一种设计模式&#xff0c…...

【Harmony OS 4.0】待办列表案例

src/main/ets/example1/Models.ets // 定义class类数据模型 export class TaskDataModel {// private 私有属性&#xff0c;在类对象外不允许随意更改数据&#xff0c;必须本地初始化。private tasks: Array<string> [早起晨练, 准备早餐, 阅读名著, 学习ArkTs, 玩游戏…...

快速把文件名统计到excel表的方法

文件名统计到EXCEL表&#xff0c;这似乎很多人都没听说过&#xff0c;因为它与EXCEL表格不沾边&#xff0c;那么这个需求如何实现&#xff0c;用到什么方法&#xff0c;今天给大家介绍一个比较实用的方法&#xff0c;它可以把文件名或文件夹的名快速提取并统计到EXCEL表格上去。…...

开源通用验证码识别OCR —— DdddOcr 源码赏析(一)

文章目录 [toc] 前言DdddOcr环境准备安装DdddOcr使用示例 源码分析实例化DdddOcr实例化过程 分类识别分类识别过程 未完待续 前言 DdddOcr 源码赏析 DdddOcr DdddOcr是开源的通用验证码识别OCR 官方传送门 环境准备 安装DdddOcr pip install ddddocr使用示例 示例图片如…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...