Unity Standard Shader 解析(二)之ForwardAdd(标准版)
一、ForwardAdd
// Additive forward pass (one light per pass)Pass{Name "FORWARD_DELTA"Tags { "LightMode" = "ForwardAdd" }Blend [_SrcBlend] OneFog { Color (0,0,0,0) } // in additive pass fog should be blackZWrite OffZTest LEqualCGPROGRAM#pragma target 3.0// -------------------------------------#pragma shader_feature_local _NORMALMAP#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON#pragma shader_feature_local _METALLICGLOSSMAP#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A#pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF#pragma shader_feature_local_fragment _DETAIL_MULX2#pragma shader_feature_local _PARALLAXMAP#pragma multi_compile_fwdadd_fullshadows#pragma multi_compile_fog// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.//#pragma multi_compile _ LOD_FADE_CROSSFADE#pragma vertex vertAdd#pragma fragment fragAdd#include "UnityStandardCoreForward.cginc"ENDCG}
引用了UnityStandardCoreForward.cginc
中的vertAdd
和fragAdd
以下是UnityStandardCoreForward.cginc
的源码
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)#ifndef UNITY_STANDARD_CORE_FORWARD_INCLUDED
#define UNITY_STANDARD_CORE_FORWARD_INCLUDED#if defined(UNITY_NO_FULL_STANDARD_SHADER)
# define UNITY_STANDARD_SIMPLE 1
#endif#include "UnityStandardConfig.cginc"#if UNITY_STANDARD_SIMPLE#include "UnityStandardCoreForwardSimple.cginc"VertexOutputBaseSimple vertBase (VertexInput v) { return vertForwardBaseSimple(v); }VertexOutputForwardAddSimple vertAdd (VertexInput v) { return vertForwardAddSimple(v); }half4 fragBase (VertexOutputBaseSimple i) : SV_Target { return fragForwardBaseSimpleInternal(i); }half4 fragAdd (VertexOutputForwardAddSimple i) : SV_Target { return fragForwardAddSimpleInternal(i); }
#else#include "UnityStandardCore.cginc"VertexOutputForwardBase vertBase (VertexInput v) { return vertForwardBase(v); }//------关键代码--------VertexOutputForwardAdd vertAdd (VertexInput v) { return vertForwardAdd(v); }half4 fragBase (VertexOutputForwardBase i) : SV_Target { return fragForwardBaseInternal(i); }//------关键代码--------half4 fragAdd (VertexOutputForwardAdd i) : SV_Target { return fragForwardAddInternal(i); }
#endif#endif // UNITY_STANDARD_CORE_FORWARD_INCLUDED
UNITY_STANDARD_SIMPLE
属于 简化版前向渲染路径 的标识符,指令区分两种实现:
- 简化版:减少复杂的光照计算(如间接光照、高光反射的精细处理),适用于移动端或低性能设备
- 标准版:完整支持基于物理的渲染(PBR)特性,包含金属度、粗糙度等完整材质属性计算
先看标准版的
查看UnityStandardCore.cginc
里的vertForwardAdd
和 fragForwardAddInternal
二、vertForwardAdd
// ------------------------------------------------------------------
// Additive forward pass (one light per pass)
struct VertexOutputForwardAdd
{UNITY_POSITION(pos);float4 tex : TEXCOORD0;float4 eyeVec : TEXCOORD1; // eyeVec.xyz | fogCoordfloat4 tangentToWorldAndLightDir[3] : TEXCOORD2; // [3x3:tangentToWorld | 1x3:lightDir]float3 posWorld : TEXCOORD5;UNITY_LIGHTING_COORDS(6, 7)// next ones would not fit into SM2.0 limits, but they are always for SM3.0+
#if defined(_PARALLAXMAP)half3 viewDirForParallax : TEXCOORD8;
#endifUNITY_VERTEX_OUTPUT_STEREO
};VertexOutputForwardAdd vertForwardAdd(VertexInput v)
{// 设置实例ID,确保正确处理实例化渲染UNITY_SETUP_INSTANCE_ID(v);// 初始化输出结构体 oVertexOutputForwardAdd o;UNITY_INITIALIZE_OUTPUT(VertexOutputForwardAdd, o);// 初始化立体视觉相关的输出UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);// 将顶点从对象空间转换到世界空间float4 posWorld = mul(unity_ObjectToWorld, v.vertex);// 将顶点从对象空间转换到裁剪空间o.pos = UnityObjectToClipPos(v.vertex);// 计算并设置纹理坐标o.tex = TexCoords(v);// 计算并设置视角方向(从世界空间相机位置到顶点的世界位置)o.eyeVec.xyz = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);// 保存顶点的世界空间位置o.posWorld = posWorld.xyz;// 将法线从对象空间转换到世界空间float3 normalWorld = UnityObjectToWorldNormal(v.normal);// 如果启用了切线到世界空间的转换#ifdef _TANGENT_TO_WORLD// 将切线从对象空间转换到世界空间float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);// 创建从切线空间到世界空间的变换矩阵float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);// 将变换矩阵存储在输出结构体中o.tangentToWorldAndLightDir[0].xyz = tangentToWorld[0];o.tangentToWorldAndLightDir[1].xyz = tangentToWorld[1];o.tangentToWorldAndLightDir[2].xyz = tangentToWorld[2];#else// 如果未启用切线到世界空间的转换,则只存储法线o.tangentToWorldAndLightDir[0].xyz = 0;o.tangentToWorldAndLightDir[1].xyz = 0;o.tangentToWorldAndLightDir[2].xyz = normalWorld;#endif// 传递光照信息以支持阴影接收和光照计算UNITY_TRANSFER_LIGHTING(o, v.uv1);// 计算光源方向float3 lightDir = _WorldSpaceLightPos0.xyz - posWorld.xyz * _WorldSpaceLightPos0.w;// 如果不是平行光,则归一化光源方向#ifndef USING_DIRECTIONAL_LIGHTlightDir = NormalizePerVertexNormal(lightDir);#endif// 将光源方向存储在输出结构体中o.tangentToWorldAndLightDir[0].w = lightDir.x;o.tangentToWorldAndLightDir[1].w = lightDir.y;o.tangentToWorldAndLightDir[2].w = lightDir.z;// 如果启用了视差映射#ifdef _PARALLAXMAP// 计算切线空间旋转矩阵TANGENT_SPACE_ROTATION;// 将视图方向从对象空间转换到切线空间o.viewDirForParallax = mul(rotation, ObjSpaceViewDir(v.vertex));#endif// 传递雾效信息UNITY_TRANSFER_FOG_COMBINED_WITH_EYE_VEC(o, o.pos);// 返回输出结构体return o;
}
三、vertForwardBase和vertForwardAdd的区别
vertForwardBase
和 vertForwardAdd
是两个不同的顶点着色器函数,它们分别用于处理基础光照和附加光源的前向渲染路径。
主要区别
- 输入输出结构体:
vertForwardBase
:使用VertexOutputForwardBase
输出结构体,包含更多的信息(如环境光或光照贴图UV)。vertForwardAdd
:使用VertexOutputForwardAdd
输出结构体,主要关注附加光源的计算。
-
VertexOutputForwardBase
struct VertexOutputForwardBase {UNITY_POSITION(pos);float4 tex : TEXCOORD0;float4 eyeVec : TEXCOORD1;float4 tangentToWorldAndPackedData[3] : TEXCOORD2;half4 ambientOrLightmapUV : TEXCOORD5;UNITY_LIGHTING_COORDS(6, 7) #if UNITY_REQUIRE_FRAG_WORLDPOS && !UNITY_PACK_WORLDPOS_WITH_TANGENTfloat3 posWorld : TEXCOORD8; #endifUNITY_VERTEX_INPUT_INSTANCE_IDUNITY_VERTEX_OUTPUT_STEREO };
-
VertexOutputForwardAdd
struct VertexOutputForwardAdd {UNITY_POSITION(pos);float4 tex : TEXCOORD0;float4 eyeVec : TEXCOORD1;float4 tangentToWorldAndLightDir[3] : TEXCOORD2;float3 posWorld : TEXCOORD5;UNITY_LIGHTING_COORDS(6, 7) #if defined(_PARALLAXMAP)half3 viewDirForParallax : TEXCOORD8; #endifUNITY_VERTEX_OUTPUT_STEREO };
-
世界位置的存储方式:
-
vertForwardBase
:根据编译条件选择是否打包世界位置数据到切线空间矩阵中。#if UNITY_REQUIRE_FRAG_WORLDPOS#if UNITY_PACK_WORLDPOS_WITH_TANGENTo.tangentToWorldAndPackedData[0].w = posWorld.x;o.tangentToWorldAndPackedData[1].w = posWorld.y;o.tangentToWorldAndPackedData[2].w = posWorld.z;#elseo.posWorld = posWorld.xyz;#endif#endif
-
vertForwardAdd
:直接存储世界位置o.posWorld = posWorld.xyz;
-
-
环境光或光照贴图UV:
vertForwardBase
:计算并设置环境光或光照贴图UV。o.ambientOrLightmapUV = VertexGIForward(v, posWorld, normalWorld);
vertForwardAdd
:不涉及环境光或光照贴图UV的计算。
-
光源方向的计算:
vertForwardBase
:不涉及光源方向的计算。vertForwardAdd
:计算光源方向并存储在输出结构体中。float3 lightDir = _WorldSpaceLightPos0.xyz - posWorld.xyz * _WorldSpaceLightPos0.w; #ifndef USING_DIRECTIONAL_LIGHTlightDir = NormalizePerVertexNormal(lightDir); #endif o.tangentToWorldAndLightDir[0].w = lightDir.x; o.tangentToWorldAndLightDir[1].w = lightDir.y; o.tangentToWorldAndLightDir[2].w = lightDir.z;
-
视差映射:
-
vertForwardBase
:将视图方向转换到切线空间,并存储在输出结构体中。#ifdef _PARALLAXMAPTANGENT_SPACE_ROTATION;half3 viewDirForParallax = mul(rotation, ObjSpaceViewDir(v.vertex));o.tangentToWorldAndPackedData[0].w = viewDirForParallax.x;o.tangentToWorldAndPackedData[1].w = viewDirForParallax.y;o.tangentToWorldAndPackedData[2].w = viewDirForParallax.z; #endif
-
vertForwardAdd
:类似地将视图方向转换到切线空间,但存储方式不同。#ifdef _PARALLAXMAPTANGENT_SPACE_ROTATION;o.viewDirForParallax = mul(rotation, ObjSpaceViewDir(v.vertex)); #endif
-
-
实例ID和立体视觉设置:
vertForwardBase
:包括UNITY_TRANSFER_INSTANCE_ID(v, o)
的调用,确保实例化渲染的支持。vertForwardAdd
:没有UNITY_TRANSFER_INSTANCE_ID(v, o)
的调用,但两者都初始化了立体视觉相关的输出。
总结
vertForwardBase
主要用于基础前向渲染,包含 全局光照(GI)计算,适用于标准渲染路径。vertForwardAdd
主要用于 额外的光照计算(如点光源、聚光灯),没有 GI 计算,但增加了 光照方向计算,适用于 加法混合光照 的场景。vertForwardAdd
额外存储 光源方向,用于非方向光(如点光源、聚光灯)计算,而vertForwardBase
只处理环境光和主光源。- 两者都支持 视差贴图(Parallax Mapping) 和 雾效计算。
如果你是实现 基本光照,使用 vertForwardBase
,如果你是实现 额外光源的累加计算,使用 vertForwardAdd
。
四、fragForwardAddInternal
half4 fragForwardAddInternal(VertexOutputForwardAdd i)
{// 应用抖动交叉淡入效果,以减少纹理走样的视觉伪影UNITY_APPLY_DITHER_CROSSFADE(i.pos.xy);// 设置立体视觉的眼睛索引,确保正确处理立体渲染UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);// 设置片段着色器所需的各种参数,如颜色、法线等FRAGMENT_SETUP_FWDADD(s)// 计算当前像素的光照衰减(attenuation)UNITY_LIGHT_ATTENUATION(atten, i, s.posWorld);// 获取附加光源的方向和衰减值,并生成 UnityLight 结构体UnityLight light = AdditiveLight(IN_LIGHTDIR_FWDADD(i), atten);// 初始化无间接光的 UnityIndirect 结构体UnityIndirect noIndirect = ZeroIndirect();// 使用物理基础渲染(PBR)计算最终的颜色// 参数包括:漫反射颜色、镜面反射颜色、反射率、光滑度、世界空间法线、视角方向、光源信息和间接光信息half4 c = UNITY_BRDF_PBS(s.diffColor, s.specColor, s.oneMinusReflectivity, s.smoothness, s.normalWorld, -s.eyeVec, light, noIndirect);// 提取视图向量中的雾效坐标UNITY_EXTRACT_FOG_FROM_EYE_VEC(i);// 应用雾效,使颜色朝向黑色(在叠加通道中使用),避免颜色溢出UNITY_APPLY_FOG_COLOR(_unity_fogCoord, c.rgb, half4(0, 0, 0, 0));// 输出最终颜色,包含透明度return OutputForward(c, s.alpha);
}
五、fragForwardBaseInternal和fragForwardAddInternal的区别
fragForwardBaseInternal
和 fragForwardAddInternal
是两个不同的片段着色器函数,它们分别用于不同的渲染路径和光照计算方式。
主要区别
-
光源处理:
-
fragForwardBaseInternal
:处理主光源,并计算全局光照(GI)。它通过FragmentGI
函数计算直接光照、环境光和间接光照。//主光源UnityLight mainLight = MainLight ();//全局光照UnityGI gi = FragmentGI (s, occlusion, i.ambientOrLightmapUV, atten, mainLight);
-
fragForwardAddInternal
:仅处理附加光源(通常是点光源、聚光灯等),并且不计算间接光照(noIndirect
)。//附加光源 UnityLight light = AdditiveLight (IN_LIGHTDIR_FWDADD(i), atten); //不计算间接光照 UnityIndirect noIndirect = ZeroIndirect ();
-
-
全局光照(GI):
-
fragForwardBaseInternal
:包含完整的全局光照计算,包括环境光、遮挡(AO)和间接光。half4 c = UNITY_BRDF_PBS (s.diffColor, s.specColor, s.oneMinusReflectivity, s.smoothness, s.normalWorld, -s.eyeVec, gi.light, gi.indirect);
-
fragForwardAddInternal
:不涉及全局光照,只处理直接光照。half4 c = UNITY_BRDF_PBS (s.diffColor, s.specColor, s.oneMinusReflectivity, s.smoothness, s.normalWorld, -s.eyeVec, light, noIndirect);
-
-
自发光(Emission):
-
fragForwardBaseInternal
:在最终颜色中添加了自发光效果。c.rgb += Emission(i.tex.xy);
-
fragForwardAddInternal
:没有自发光的计算。
-
-
雾效处理:
-
fragForwardBaseInternal
:使用_unity_fogCoord
应用标准雾效。UNITY_APPLY_FOG(_unity_fogCoord, c.rgb);
-
fragForwardAddInternal
:应用雾效时将颜色混合为黑色(half4(0, 0, 0, 0)
),这通常用于叠加通道以避免颜色溢出。UNITY_APPLY_FOG_COLOR(_unity_fogCoord, c.rgb, half4(0,0,0,0));
-
-
输入结构体:
fragForwardBaseInternal
:使用VertexOutputForwardBase
输入结构体,包含更多信息(如纹理坐标、法线等)。fragForwardAddInternal
:使用VertexOutputForwardAdd
输入结构体,可能包含较少的信息,专注于附加光源的计算。
-
实例化和立体视觉设置:
fragForwardBaseInternal
:包含了UNITY_SETUP_INSTANCE_ID
和UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX
的调用,确保实例化和立体视觉支持。fragForwardAddInternal
:同样包含这些调用,但可能由于附加光源的特殊性,对这些设置的需求有所不同。
总结
fragForwardBaseInternal
:适用于基本的前向渲染路径,处理所有类型的光源(包括主光源)和全局光照,提供更全面的光照计算。fragForwardAddInternal
:适用于附加光源的前向渲染路径,主要用于叠加额外的点光源或聚光灯,简化了光照计算,不涉及全局光照和自发光。
这两种函数的设计目的是为了优化不同场景下的渲染效率,同时保证渲染质量和效果的一致性。
相关文章:
Unity Standard Shader 解析(二)之ForwardAdd(标准版)
一、ForwardAdd // Additive forward pass (one light per pass)Pass{Name "FORWARD_DELTA"Tags { "LightMode" "ForwardAdd" }Blend [_SrcBlend] OneFog { Color (0,0,0,0) } // in additive pass fog should be blackZWrite OffZTest LEqual…...
.NET 使用 WMQ 连接Queue 发送 message 实例
1. 首先得下载客户端,没有客户端无法发送message. 安装好之后长这样 我装的是7.5 安装目录如下 tools/dotnet 目录中有演示的demo 2. .Net 连接MQ必须引用bin目录中的 amqmdnet.dll 因为他是创建Queuemanager 的核心库, 项目中引用using IBM.WMQ; 才…...
设计模式之单例模式
视频链接: 设计模式|狂神说 单例模式是什么? 单例模式是确保一个类在整个应用程序中只有一个实例,并提供一个全局方法访问这个实例。 单例模式分为饿汉式和懒汉式。 饿汉式单例 饿汉式顾名思义就是,程序一启动就创建这个单例bea…...
从入门到入土,SQLServer 2022慢查询问题总结
列为,由于公司原因,作者接触了一个SQLServer 2022作为数据存储到项目,可能是上一任的哥们儿离开的时候带有情绪,所以现在项目的主要问题就是,所有功能都实现了,但是就是慢,列表页3s打底,客户很生气,经过几周摸爬滚打,作以下总结,作为自己的成长记录。 一、索引问题…...
大语言模型在端到端智驾中的应用
大语言模型在端到端智驾中的应用 双系统端到端 小鹏:AI天玑系统—神经网络XNet规控大模型XPlanner大语言模型XBrain 商汤绝影:DriveAGI 理想:端到端VLM VLA端到端 Waymo:EMMA OPENEMMA Wayve:LINGO-2...
【深度学习量化交易19】行情数据获取方式比测(1)——基于miniQMT的量化交易回测系统开发实记
我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 经常使用MiniQMT的朋友都知道,xtquant的…...
《网络管理》实践环节03:snmp服务器上对网络设备和服务器进行初步监控
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 应用拓扑图 3.0准备工作 所有Linux服务器上(服务器和Agent端)安装下列工具 yum -y install net-snmp net-snmp-utils 保证所有的HCL网络设备和服务器相互间能…...
linux操作系统
1.linux进程管理 操作系统都有进程的概念 查看和关闭程序 2.关闭进程 3,查看计算机硬件信息 4.定时任务...
Python基础语法 - 判断语句
Python基础语法 - 判断语句 1. if语句 if 条件:# 条件为True时执行的代码示例 age 18 if age > 18:print("您已成年")2. if-else语句 if 条件:# 条件为True时执行的代码 else:# 条件为False时执行的代码示例 age 16 if age > 18:print("您已成年&q…...
c++柔性数组、友元、类模版
目录 1、柔性数组: 2、友元函数: 3、静态成员 注意事项 面试题:c/c static的作用? C语言: C: 为什么可以创建出 objx 4、对象与对象之间的关系 5、类模版 1、柔性数组: #define _CRT_SECURE_NO_WARNINGS #…...
电子技术基础
目录 一、整体概述 二、知识点梳理及考点分析 (一)半导体器件 (二)基本放大电路 (三)功率放大电路 (四)集成运算放大器 (五)直流稳压电源 ࿰…...
解码大模型时代算力基座的隐形引擎
在千亿参数大模型竞速的今天,算力军备竞赛已进入白热化阶段。当我们聚焦GPU集群的运算峰值时,一个关键命题正在浮出水面:支撑大模型全生命周期的存力基座,正在成为制约AI进化的关键变量。绿算技术将深入解剖大模型训练与推理场景中…...
【NetCore】ControllerBase:ASP.NET Core 中的基石类
ControllerBase:ASP.NET Core 中的基石类 一、什么是 ControllerBase?二、ControllerBase 的主要功能三、ControllerBase 的常用属性四、ControllerBase 的常用方法2. 模型绑定与验证3. 依赖注入五、ControllerBase 与 Controller 的区别六、实际开发中的最佳实践七、总结在 …...
人工智能之数学基础:矩阵分解之LU分解
本文重点 LU分解是线性代数中一种重要的矩阵分解方法,它将一个方阵分解为一个下三角矩阵(L)和一个上三角矩阵(U)的乘积。这种分解方法在数值线性代数中有着广泛的应用,特别是在求解线性方程组、计算矩阵的行列式、求逆矩阵等方面。 LU分解的基本概念 设A是一个nn的方阵…...
C#核心学习(六)面向对象--封装(5)静态成员及静态构造函数和静态类 以及和常量的区别
目录 一、什么是静态的?什么是常量? 1. 静态(Static) 2. 常量(const) 二、类中的静态成员有什么用? 1. 共享数据 2. 工具方法与全局配置 3. 单例模式 三、静态类和静态成…...
去中心化稳定币机制解析与产品策略建议
去中心化稳定币机制解析与产品策略建议(以Maker/DAI为例) 一、核心机制对比:法币抵押型 vs. 加密货币抵押型 法币抵押型(如USDT) 技术逻辑:1:1美元储备托管于中心化机构(如银行)&…...
构造超小程序
文章目录 构造超小程序1 编译器-大小优化2 编译器-移除 C 异常3 链接器-移除所有依赖库4 移除所有函数依赖_RTC_InitBase() _RTC_Shutdown()__security_cookie __security_check_cookie()__chkstk() 5 链接器-移除清单文件6 链接器-移除调试信息7 链接器-关闭随机基址8 移除异常…...
JSONP跨域访问漏洞
一、漏洞一:利用回调GetCookie <?php$conn new mysqli(127.0.0.1,root,root,learn) or die("数据库连接不成功"); $conn->set_charset(utf8); $sql "select articleid,author,viewcount,creattime from learn3 where articleid < 5"; $result…...
数据结构优化DP总结
单调栈:Codeforces Round 622 (Div. 2) C2. Skyscrapers (hard version) 简单来讲就是最后需要呈现出一个单峰数组,使得总高度最高。 最开始想到暴力枚举每一个元素都充当最高的“单峰”,但是这里的 n 过大,这样枚举肯定会TLE。 …...
Linux网络相关概念和重要知识(4)(序列化和反序列化、TCP协议、会话和守护进程)
目录 1.序列化和反序列化 (1)为什么需要序列化 (2)序列化方案 ①json ②json序列化代码模板 ③json反序列化代码模板 ④将自定义方案和json结合 2.TCP协议(传输控制协议) (1)…...
[MySQL初阶]MySQL数据库基础
MySQL数据库基础 1. 数据库基础1.1 什么是数据库1.2 主流数据库2. 数据库的基本使用2.1 连接服务器2.2 使用案例2.3 数据逻辑存储3. MySQL架构与分类3.1 MySQL架构3.2 SQL分类4. 存储引擎4.1 存储引擎基本概念4.2 存储引擎基本操作1. 数据库基础 1.1 什么是数据库 存储数据用…...
【mysql 的安装及使用】
MySQL 9.0 一、下载MySQL[MySQL 9.0 下载] [(https://dev.mysql.com/downloads/mysql/)选择自定义,选择合适安装路径二、检查安装情况配置环境变量打开命令行查看版本创建数据库在MySQL中,可以使用create database语句来创建数据库。以下是创建一个名为my_db的数据库的示例:…...
d202542
一、142.环形链表I 142. 环形链表 II - 力扣(LeetCode) 用set统计一下 如果再次出现那么就环的第一个return返回就行 public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while(cur ! …...
vscode代码片段的设置与使用
在 Visual Studio Code (VS Code) 中,可以通过自定义**代码片段(Snippets)**快速插入常用代码模板。以下是详细设置步骤: 步骤 1:打开代码片段设置 按下快捷键 Ctrl Shift P(Windows/Linux)或…...
3D 地图渲染-区域纹理图添加
引入-初始化地图(关键代码) // 初始化页面引入高德 webapi -- index.html 文件 <script src https://webapi.amap.com/maps?v2.0&key您申请的key值></script>// 添加地图容器 <div idcontainer ></div>// 地图初始化应该…...
spring-security原理与应用系列:HttpSecurity.filters
目录 AnyRequestMatcher WebSecurityConfig HttpSecurity AbstractInterceptUrlConfigurer AbstractAuthenticationProcessingFilter 类图 在前面的文章《spring-security原理与应用系列:securityFilterChainBuilders》中,我们遗留了一个问题&…...
每日总结4.2
蓝桥杯刷题: 1. 方格分割(dfs,选中心点,开始上下左右遍历,达到边界时数量加一) #include <bits/stdc.h> using namespace std; bool vis[10][10]; int mp[10][10]; int ans0; int dx[4]{1,0,0,-1}; int dy[4]{…...
架构师面试(二十五):分布式存储 Leader 设计
问题 在非常多的分布式存储系统中,如:Zookeeper、Etcd、Kafka等,往往会存在一个 【Leader】 角色,并由该角色负责数据的写入,这样设计最主要的原因是什么呢? A. 唯一负责数据写入的 Leader 角色可以避免并…...
mycat --分片规则--
文章目录 MyCat分片规则详解1. rule1 (基于id的func1算法)2. sharding-by-date (按日期分片)3. rule2 (基于user_id的func1算法)4. sharding-by-intfile (基于枚举值分片)5. auto-sharding-long (长整型范围分片)6. mod-long (取模分片)7. sharding-by-murmur (MurmurHash分片)…...
系统分析师备考启动
以考促学:软件高级系统分析师。 一、考试目的: 1、练习三遍读书法、快速阅读、番茄工作法、第一性原理、思维导图等学习方法和学习工具的使用。 2、掌握知识、编织知识网、顺便拿证。 二、组织形式: 小组统一安排学习内容,每…...
轻量级搜索接口技术解析:快速实现关键词检索的Java/Python实践
Hi,你好! 轻量级搜索接口技术解析:快速实现关键词检索的Java/Python实践 接口特性与适用场景 本接口适用于需要快速集成搜索能力的开发场景,支持通过关键词获取结构化搜索结果。典型应用场景包括: 垂直领域信息检索…...
防爆风扇选型指南:根据风量风压匹配应用场景
在化工、石油、煤矿等存在易燃易爆气体或粉尘的危险环境中,通风设备的安全性能至关重要,防爆风扇成为保障生产环境安全与空气流通的关键装备。正确选型是确保其发挥最佳效能的前提,而根据风量风压匹配应用场景则是选型的核心要点。 风量&am…...
Laravel 中使用 JWT 作用户登录,身份认证
什么是JWT: JWT 全名 JSON Web Token,是一种开放标准 (RFC 7519)。 用于在网络应用环境间安全地传输信息作为 JSON 对象。 它是一种轻量级的认证和授权机制,特别适合分布式系统的身份验证。 核心特点 紧凑格式:体积小&#x…...
Git安装
1、 下载Git https://git-scm.com/ 2、 双击【Git-2.44.0-64-bit.exe】安装: 2-1、 选择自定义安装目录:F:\software\Git 2-2、 一直点击next,直到安装成功。 2-3、 在git项目文件夹,右键出现Git GUI Here和Git Bash Here就说明成…...
bit与byte的区别与联系?
李升伟 整理 byte 和 bit 是计算机中常用的数据单位,它们的主要区别和联系如下: 1. 定义 bit(比特):计算机中最小的数据单位,表示一个二进制位,值为0或1。 byte(字节)…...
程序化广告行业(51/89):Cookie映射与移动设备ID映射解析
程序化广告行业(51/89):Cookie映射与移动设备ID映射解析 在当今数字化营销的浪潮中,程序化广告已经成为企业精准触达目标客户的重要手段。作为一名对程序化广告充满兴趣的学习者,我希望通过这篇博客和大家一起深入探索…...
从吉卜力漫画到艺术创造:GPT-4o多种风格绘图Prompt大全
在3月底,GPT-4o掀起了一阵吉卜力绘图浪潮,大家纷纷输入一张图片,让4o模型进行风格化迁移,其中吉卜力风格的漫画在社交媒体上最为火热。在大家争议4o的训练数据是否侵权和4o背后的技术原理的时候,我们先来玩一玩&#x…...
48. 旋转图像
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 先上下翻转再沿着对角线翻转 提示:小白个人理解,如有错误敬请谅解! 二、外层配合操作 三、核心模式代码 代码如下: class S…...
【Linux篇】自主Shell命令行解释器
📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 文章目录 1. 获取用户名的接口2. 等待用户输入接口3. 将上述代码进行面向对象式的封装4. 命令行解析5.…...
leetcode 2873. 有序三元组中的最大值 I
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 文章目录 题目描述题目剖析&信息挖掘解题思路方法一 暴力枚举法思路注意复杂度代码实现 方法二 公式拆分动态规划思路注意复杂度代码实现 题目描述 [2873] 有序三元…...
深度学习 Deep Learning 第14章 自编码器
深度学习 Deep Learning 第14章 自编码器 内容概要 本章深入探讨了自编码器(Autoencoders),这是一种用于特征学习和降维的神经网络架构。自编码器通过编码器和解码器两个部分,将输入数据映射到一个内部表示(编码&…...
全国产传感器的可靠性、MTBF计算、极限测试与加速寿命测试
全国产传感器的可靠性是指传感器在规定条件下和规定时间内完成规定功能的能力。它是衡量传感器性能的重要指标之一,直接影响传感器的使用寿命和系统稳定性。武汉利又德的小编来和大家分享一下关于全国产传感器的可靠性以及MTBF计算、极限测试与加速寿命测试的小知识…...
【算法中的数学】裴蜀定理(Bézout’s Identity)总结
裴蜀定理(Bzout’s Identity)总结 裴蜀定理是数论中的一个重要定理,描述了整数线性组合与最大公约数(GCD)之间的关系。 1. 裴蜀定理的内容 对于任意两个整数 a a a 和 b b b,设它们的最大公约数为 d …...
unity点击button后不松开通过拖拽显示模型松开后模型实例化
using System.Collections; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;[RequireComponent(typeof(Button))] // 确保脚本挂在Button上 public class DragButtonSpawner : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandle…...
计算机网络复习 吉林大学
1、信息交换的三种方式:电路交换,分组交换,报文交换。 从通信资源的分配角度来看,交换就是按照某种方式动态地分配传输线路的资源。 电路交换:(星形结构替代全连接) 电话交换机接通电话的方式…...
超级好用的小软件,连接电脑和手机。
将手机变成电脑摄像头的高效工具Iriun Webcam是一款多平台软件,能够将手机摄像头变成电脑的摄像头,通过简单的设置即可实现视频会议、直播、录制等功能。它支持Windows、Mac和Linux系统,同时兼容iOS和Android手机,操作简单&#x…...
【JavaScript】十三、事件监听与事件类型
文章目录 1、事件监听1.1 案例:击关闭顶部广告1.2 案例:随机点名1.3 事件监听的版本 2、事件类型2.1 鼠标事件2.1.1 语法2.1.2 案例:轮播图主动切换 2.2 焦点事件2.2.1 语法2.2.2 案例:模拟小米搜索框 2.3 键盘事件2.3.1 语法2.3.…...
微服务架构技术栈选型避坑指南:10大核心要素深度拆解
微服务架构的技术栈选型直接影响系统的稳定性、扩展性和可维护性。以下从10大核心要素出发,结合主流技术方案对比、兼容性评估、失败案例及优化策略,提供系统性选型指南。 1. 服务框架与通信 关键考量点 扩展性:框架需支持定制化扩展&#x…...
虚拟试衣间微信小程序解决方案
目录 项目名称: 云尚衣橱 核心功能模块: 技术栈选型: 架构设计概览: 详细功能点实现思路: 数据库设计 (MongoDB 示例): 开发步骤建议: 关键注意事项和挑战: 项目名称: 云尚衣橱 核心功能模块: 用户系统 (User System) 我的衣柜 (My Wardrobe) 虚拟试衣间 (Vir…...
C++STL——容器-vector(含部分模拟实现,即地层实现原理)(含迭代器失效问题)
目录 容器——vector 1.构造 模拟实现 2.迭代器 模拟实现: 编辑 3.容量 模拟实现: 4.元素的访问 模拟实现 5.元素的增删查改 迭代器失效问题: 思考问题 【注】:这里的模拟实现所写的参数以及返回值,都是…...