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

Unity Shader编程】之复杂光照

在Unity Shader的LightMode标签中,除了前向渲染和延迟渲染外,还支持多种渲染模式设置。以下是主要分类及用途:


一、核心渲染路径模式

  1. 前向渲染相关

    • ForwardBase
      用于基础光照计算,处理环境光、主平行光、逐顶点/SH光源及光照贴图。
    • ForwardAdd
      处理额外逐像素光源,每个Pass对应一个光源(如点光源、聚光灯)。
  2. 延迟渲染相关

    • Deferred
      用于现代延迟渲染路径,负责将几何数据写入G-Buffer(法线、位置、材质参数等)。

二、辅助功能模式
3. 阴影处理

  • ShadowCaster
    将物体深度信息写入阴影贴图或深度纹理,用于生成动态阴影。
  1. 遗留模式
    • PrepassBase
      旧版延迟渲染的第一阶段,渲染法线和高光反射的指数部分。
    • PrepassFinal
      旧版延迟渲染的最终阶段,合并光照和自发光生成最终颜色。

三、特殊用途模式
5. 无条件渲染

  • Always
    无论当前渲染路径如何,该Pass总被执行,但不参与光照计算(如全屏后处理)。
  1. 顶点光照模式(已弃用)
    • VertexVertexLMRGBMVertexLM
      用于旧版顶点照明渲染路径,Unity 5.0后已废弃。

四、选择建议

  • 多光源场景:优先使用延迟渲染(Deferred),通过G-Buffer优化计算。
  • 移动端优化:前向渲染(ForwardBase+ForwardAdd)更节省带宽。
  • 阴影生成:必须包含ShadowCaster Pass以保证动态阴影正常渲染。

具体设置示例:

Pass {Tags { "LightMode" = "ForwardBase" } // 主光源Pass // Shader代码...
}Pass {Tags { "LightMode" = "ShadowCaster" } // 阴影投射Pass // 阴影生成逻辑...
}

前向渲染

‌一、核心渲染路径类型‌
‌前向渲染路径(Forward Rendering)‌
‌ ForwardBase‌:处理主平行光(逐像素)、环境光、光照贴图及顶点光照,‌必须存在且仅调用一次‌‌。
‌ ForwardAdd‌:处理附加逐像素光源(点光源、聚光灯、次要平行光),每盏光源触发一次 Pass 调用‌。
以下是 Unity 前向渲染中 ‌ForwardAdd Pass‌ 的关键设定与注意事项:

一、基础配置‌

混合模式‌

必须设置 Blend One One‌:叠加多光源贡献(默认 Blend Off 会导致后续光源覆盖先前结果)‌。
错误示例:未启用混合时,仅保留最后一次光源计算结果。

深度缓冲‌

关闭深度写入‌:设置 ZWrite Off,避免覆盖 ForwardBase 写入的深度值‌。

Pass 标签‌

强制声明 LightMode‌:
glsl
Copy Code
Tags { “LightMode” = “ForwardAdd” }

否则 Unity 无法识别为附加光源处理 Pass‌。
二、光源处理规则‌

光源分配逻辑‌

仅处理逐像素光源‌:包括点光源、聚光灯及次要方向光,且需满足以下条件之一:
光源的 ‌Render Mode‌ 设为 Important‌
光源强度在场景中排名靠前(受 QualitySettings.pixelLightCount 限制)‌
每光源触发一次 Pass‌:场景中有 N 个逐像素光源时,ForwardAdd 会被调用 N-1 次(主方向光由 ForwardBase 处理)‌。

光源数据获取‌

_WorldSpaceLightPos0‌:
方向光时为世界空间方向向量
点光源/聚光灯时为世界空间坐标‌
_LightColor0‌:当前光源颜色与强度(含衰减后的值)‌。
三、阴影与衰减‌

阴影支持‌

需显式启用宏‌:
glsl
Copy Code
#pragma multi_compile_fwdadd_fullshadows

否则附加光源的阴影不会生效‌。
使用 UNITY_LIGHT_ATTENUATION‌:自动计算光源衰减与阴影(需包含 AutoLight.cginc)‌。

衰减纹理‌

点光源/聚光灯依赖 _LightTexture0‌:Unity 自动根据光源类型生成衰减纹理‌。
四、性能优化‌

控制光源数量‌

减少 Important 模式光源‌:避免过多逐像素光源触发 ForwardAdd Pass‌。
调整 pixelLightCount‌:在 Project Settings > Quality 中限制最大逐像素光源数‌。

剔除不必要计算‌

禁用无关宏‌:若无需阴影,移除 _fullshadows 以减少 Shader 变体‌。
简化光照计算‌:在 ForwardAdd 中避免复杂运算(如 PBR 高光)‌。
五、调试建议‌
Frame Debugger‌
查看每个 ForwardAdd Pass 对应的实际光源及调用次数‌。
光源排序验证‌
通过 _LightColor0 输出颜色值,确认光源是否按强度降序处理‌。
六、典型代码示例‌
glsl
Copy Code
Pass {
Tags { “LightMode” = “ForwardAdd” }
Blend One One // 叠加模式
ZWrite Off

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdadd_fullshadows // 阴影支持
#include "UnityCG.cginc"
#include "AutoLight.cginc" // 衰减与阴影计算struct v2f {float4 pos : SV_POSITION;float3 worldPos : TEXCOORD0;float3 normal : TEXCOORD1;UNITY_SHADOW_COORDS(2) // 阴影坐标
};v2f vert (appdata_base v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.normal = UnityObjectToWorldNormal(v.normal);UNITY_TRANSFER_SHADOW(o, o.worldPos); // 传递阴影数据return o;
}fixed4 frag (v2f i) : SV_Target {float3 lightDir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos); // 点光源方向float3 diffuse = _LightColor0.rgb * max(0, dot(i.normal, lightDir));UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos); // 衰减+阴影return fixed4(diffuse * atten, 1.0);
}
ENDCG

}

总结‌

ForwardAdd 的核心设定包括:‌混合模式、光源筛选规则、阴影宏启用、衰减计算及性能优化策略‌。正确配置后可实现高效多光源叠加,同时需避免因逐像素光源过多导致的性能瓶颈‌。

在ForwardAdd中,可能需要判断光源类型,距离,强度等,来得出正确的效果

// 片段着色器函数,输入结构体v2f,返回像素颜色
fixed4 frag(v2f i) : SV_Target {// 规范化世界空间法线(从顶点着色器插值得到)fixed3 worldNormal = normalize(i.worldNormal);// 根据光源类型计算光线方向#ifdef USING_DIRECTIONAL_LIGHT// 方向光:_WorldSpaceLightPos0直接存储方向向量fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);#else// 点光源/聚光灯:需要计算光源到片段的向量(_WorldSpaceLightPos0存储的是光源位置)fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz);#endif// 漫反射计算(Lambert光照模型)// _LightColor0:当前光源颜色和强度// _Diffuse:材质漫反射颜色fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir));// 高光计算(Blinn-Phong模型)// 计算视线方向:摄像机位置 - 片段位置fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);// 计算半角向量:光线方向 + 视线方向fixed3 halfDir = normalize(worldLightDir + viewDir);// _Specular:材质高光颜色,_Gloss:高光指数fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);// 衰减计算#ifdef USING_DIRECTIONAL_LIGHT// 方向光没有衰减fixed atten = 1.0;#else#if defined (POINT)// 点光源衰减计算(使用立方体贴图衰减)// 将世界坐标转换到光源空间float3 lightCoord = mul(unity_WorldToLight, float4(i.worldPos, 1)).xyz;// 根据距离采样衰减纹理(dot(lightCoord,lightCoord)得到距离平方)fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;#elif defined (SPOT)// 聚光灯衰减计算(结合角度衰减和距离衰减)float4 lightCoord = mul(unity_WorldToLight, float4(i.worldPos, 1));// 角度衰减:使用投影纹理坐标float spotAtten = (lightCoord.z > 0) * tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w;// 距离衰减:使用二次衰减纹理float distAtten = tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;fixed atten = spotAtten * distAtten;#else// 未知光源类型默认无衰减fixed atten = 1.0;#endif#endif// 最终颜色 = (漫反射 + 高光) * 衰减return fixed4((diffuse + specular) * atten, 1.0);
}

二、阴影

开启阴影对硬件资源的影响分析

一、核心硬件影响维度

  1. GPU负载显著提升

    • 阴影渲染涉及大量光栅化计算和像素填充率消耗,尤其是动态阴影和高质量软阴影
    • 实时光追阴影的计算复杂度更高,可能占用50%以上的GPU算力(如《黑神话:悟空》开启光追阴影时)
  2. CPU参与计算

    • 负责处理物体位置关系和光源投影逻辑等基础数据
    • 多光源场景中,CPU需为每个光源生成阴影贴图计算指令
  3. 显存占用增加

    • 高分辨率阴影贴图可能占用200MB+显存(如4K阴影贴图)
    • 虚拟阴影技术可降低显存消耗但需要GPU支持

二、硬件影响程度对比

硬件类型影响程度典型场景案例
GPU★★★★★开启高质量软阴影后帧率下降40%+
CPU★★☆百人同屏战斗时阴影计算导致CPU占用提升15%
内存★☆☆8GB显存显卡开启最高阴影需预留2GB空间

  1. 阴影的基础知识
    阴影是 3D 图形中用于表现物体遮挡光线的重要技术,能够增强场景的真实感。在 Unity 中,阴影主要分为以下几种类型:
    实时阴影(Real-time Shadows):适用于动态物体和光源,实时计算阴影效果。
    烘焙阴影(Baked Shadows):适用于静态物体和光源,预先计算并存储在光照贴图中。
    阴影贴图(Shadow Maps):一种常见的实时阴影技术,通过渲染光源视角下的深度图来判断哪些区域被遮挡。
    在 Unity Shader 中,阴影的实现主要依赖 阴影贴图(Shadow Maps) 技术。

  2. Unity 中的阴影实现
    1.渲染阴影投射:
    Unity 会为每个投射阴影的光源(如方向光)生成一张阴影贴图。这张贴图记录了从光源视角看到的场景深度信息。
    2,物体的 Shader 需要包含一个特殊的 Pass(称为 “ShadowCaster” Pass),以将物体的深度信息渲染到阴影贴图中。
    采样阴影贴图:
    在渲染物体时,Shader 会根据物体的世界坐标采样阴影贴图,判断当前像素是否处于阴影中。
    Unity 提供了内置函数(如 UnitySampleShadow 或 SHADOW_ATTENUATION),方便开发者获取阴影信息。
    3.应用阴影效果:
    根据采样结果,Shader 调整光照强度(通常是乘以一个阴影衰减值),从而实现阴影的显示。

  3. 自定义阴影 Shader 的编写
    要添加pass
    Pass
    {
    Tags { “LightMode” = “ShadowCaster” }}
    }
    这样子就有阴影

3,阴影原理

深度比较原理与阴影判断逻辑


核心判断逻辑
当屏幕空间像素在光源空间下的深度值 > 阴影映射纹理中的对应值时,该像素处于阴影中。这一结论源于以下三维空间遮挡关系的数学表达:

  1. 光源视角的深度记录
    阴影映射纹理记录了光源可见范围内所有物体表面的最近深度值(即光源到物体表面的最小距离)。

  2. 当前像素的深度计算
    将屏幕空间像素的坐标转换到光源空间后,计算其到光源的距离(即当前深度值)。

  3. 遮挡关系判定

    • 若当前深度值 > 阴影映射值 → 光源路径上存在更近的物体遮挡 → 处于阴影中
    • 若当前深度值 ≤ 阴影映射值 → 无遮挡 → 未被阴影覆盖
      注:此处的比较方向需根据坐标系定义调整,部分API可能相反

几何原理可视化

  1. 光源空间坐标系
  • Z轴方向:通常指向光源正前方(左手或右手系根据引擎定义)
  • 深度值:沿Z轴方向的距离(范围由投影矩阵决定)
  1. 实例分析
    | 位置状态 | 光源深度图值 | 当前像素深度值 | 结果 |
    |--------------------|--------------|----------------|----------|
    | 遮挡物表面点 | 0.3 | 0.5 | 阴影区域 |
    | 遮挡物自身表面点 | 0.3 | 0.3 | 非阴影 |
    | 无遮挡区域 | 0.3 | 0.2 | 非阴影 |

技术实现关键点

  1. 坐标系对齐
  • 需保证屏幕空间与光源空间的坐标转换矩阵一致(涉及VP矩阵链式乘法)
  • 常见误差来源:浮点数精度问题、非均匀深度分布

Screen Space Shadow Mapping(SSSM)与传统Shadow Mapping对比解析

一、核心差异对比

  1. 处理阶段与数据来源
    | 技术类型 | 处理阶段 | 数据来源 | 计算范围 |
    |--------------------|-------------------|----------------------------|---------------------|
    | 传统Shadow Mapping | 物体渲染阶段(Forward模式) | 光源视角生成的深度图(ShadowMap) | 场景中所有可能投射阴影的物体 |
    | SSSM | 屏幕空间阶段(Deferred模式) | 摄像机深度图+光源ShadowMap | 仅通过深度测试的可见像素 |

  2. 实现原理差异

  • 传统Shadow Mapping

    1. 光源视角渲染场景生成ShadowMap(记录最近深度)
    2. 实际渲染时,将物体顶点转换到光源空间,与ShadowMap中的深度对比
    3. 必须处理所有可能遮挡的物体,即使这些物体在摄像机视角不可见
  • Screen Space Shadow Mapping

    1. 预生成摄像机深度图(屏幕空间可见像素的深度)
    2. 结合光源ShadowMap,仅在屏幕空间中对可见像素进行阴影计算
    3. 通过CollectShadows阶段生成屏幕空间阴影纹理,其他物体采样该纹理即可

二、性能与效率对比

  1. 传统Shadow Mapping的局限性
  • Overdraw问题:在Forward渲染中,阴影计算可能因物体覆盖而被浪费
  • 全场景计算:需处理所有可能投射阴影的物体,包括视锥体外不可见物体
  1. SSSM的优势
  • 精准裁剪:仅处理摄像机可见像素,减少冗余计算
  • 硬件优化:利用屏幕空间深度图(如_CameraDepthTexture),避免重复渲染
  • 移动端友好:统计显示优化后的SSSM在移动端可提升30%+渲染效率

三、应用场景选择

  1. 推荐使用SSSM的情况
  • Deferred渲染管线:需屏幕空间数据支持
  • 复杂场景交互:当存在大量动态物体且需要高效剔除不可见阴影时
  • 移动端项目:需减少GPU计算负载的场景
  1. 传统Shadow Mapping的适用场景
  • 简单场景/低端设备:硬件不支持SSSM时
  • 特殊效果需求:如需要自定义阴影投射逻辑(如透明物体阴影)

四、开发者注意事项

  1. 深度图生成

    • SSSM依赖_CameraDepthTexture,需确保摄像机开启深度渲染
    • 传统方法需实现ShadowCaster Pass生成光源ShadowMap
  2. 坐标系转换

    • 在SSSM中需将屏幕空间坐标转换到光源空间:
      float4 lightSpacePos = mul(_LightMatrix, float4(worldPos, 1.0));
      
  3. 性能权衡

    • SSSM在复杂场景中更高效,但会占用更多显存(存储屏幕空间阴影纹理)
    • 传统方法在小场景中可能更节省资源

半透明物体的阴影技术解析

核心结论
是的,半透明物体在 Shadow Mapping 中可以通过特定方法生成阴影,但在 Screen Space Shadow Mapping 中通常无法正确显示阴影。具体原因如下:


  1. Shadow Mapping 中的表现
    实现原理
  • 传统阴影贴图技术:通过光源视角生成深度图(ShadowMap),在渲染时比较物体深度与ShadowMap深度判断是否处于阴影中。
  • 半透明处理方式:
    • 透明度测试(Alpha Test):通过clip()丢弃部分像素,保留深度信息,可在ShadowMap中生成硬边阴影 。
    • 透明度混合(Alpha Blend):需自定义Shader,在ShadowCaster Pass中强制写入深度,使半透明物体参与阴影计算 。

代码示例

// 自定义ShadowCaster Pass处理半透明阴影 
struct v2f_shadow {float4 pos : SV_POSITION;float2 uv : TEXCOORD0;
};v2f_shadow vert_shadow(appdata_base v) {v2f_shadow o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;
}fixed4 frag_shadow(v2f_shadow i) : SV_Target {fixed alpha = tex2D(_MainTex, i.uv).a;clip(alpha - _Cutoff); // 强制写入深度 return 0;
}

  1. Screen Space Shadow Mapping 中的限制
    技术缺陷
  • 依赖深度缓冲:屏幕空间阴影映射基于摄像机深度纹理,但半透明物体默认关闭深度写入(ZWrite Off),导致其无法正确参与阴影计算 。
  • 混合模式冲突:Alpha混合的物体在屏幕空间中无法生成有效的深度数据,导致阴影缺失。

典型现象

  • 半透明物体(如水面)可能投射不完整阴影(仅部分区域可见)或无阴影 。
  • 阴影边缘可能出现伪影(Artifacts),因光线追踪算法无法正确处理透明区域 。

  1. 解决方案对比
    | 技术类型 | 适用场景 | 实现难度 | 性能消耗 | 阴影质量 |
    |-------------------------|------------------------|----------|----------|----------------|
    | Shadow Mapping | 静态光源、硬边阴影 | 中等 | 低 | 高(需优化) |
    | Screen Space Shadows| 动态场景、软阴影 | 高 | 中高 | 低(半透明失效)|

  1. 开发者注意事项

  2. 渲染队列设置

    • 将半透明物体的RenderQueue设为AlphaTest(2500以下),以兼容阴影系统 。
  3. Shader优化

    • 使用alphatest处理阴影投射,同时保留主Pass的alphablend效果 。
  4. 光照模式限制

    • 屏幕空间阴影要求Shader为Pixel-Lit且使用Geometry渲染队列 。

相关文章:

Unity Shader编程】之复杂光照

在Unity Shader的LightMode标签中,除了前向渲染和延迟渲染外,还支持多种渲染模式设置。以下是主要分类及用途: 一、核心渲染路径模式 前向渲染相关 ForwardBase 用于基础光照计算,处理环境光、主平行光、逐顶点/SH光源及光照贴图。…...

解锁U盘属性0字节困境,重获数据生机

在数字化浪潮中,U盘宛如一位忠诚的“数据信使”,频繁穿梭于各种设备之间,为我们存储和传输着重要信息。然而,当U盘突然显示属性为0字节时,就如同这位信使突然“失声”,让我们陷入了数据丢失的恐慌之中。U盘…...

⭐算法OJ⭐二叉树的直径【树】(C++实现)Binary Tree Paths

543. Binary Tree Paths(二叉树的直径) Given the root of a binary tree, return the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or m…...

docker使用命令笔记

docker使用命令笔记 1. 安装docker2. 拉取镜像3. 镜像与容器4. 基于镜像创建容器4. 操作创建好的容器5. docker文件传输6. ubuntu的docker的一些基本环境搭建 记录docker的一些使用命令 1. 安装docker 遵循官方安装说明即可,windows需要下载docker desktop后在doc…...

字典树与01trie

字典树简介 当我们通过字典查一个字或单词的时候,我们会通过前缀或关键字的来快速定位一个字的位置,进行快速查找。 字典树就是类似字典中索引表的一种数据结构,能够帮助我们快速定位一个字符串的位置。 字典树是一种存储字符串的数据结构…...

vue - [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update error.

问题描述: vue项目中,对表单数组赋值时,控制台抛出警告: 问题代码: 问题分析: 1、Vue 要求每个虚拟 DOM 节点必须有唯一的 key。该警告信息通常出现在使用v-for循环的场景中,多个同级节点使用…...

mysql中show命令的使用

在 MySQL 中,SHOW 命令是一个非常实用的工具,用于查询数据库元数据(如数据库、表、列、索引等信息)。以下是常见的 SHOW 命令及其用法: 1. 显示所有数据库 SHOW DATABASES;列出服务器上的所有数据库。 2. 显示当前数据…...

各类神经网络学习:(三)RNN 循环神经网络(中集),同步多对多结构的详细解释

上一篇下一篇RNN(上集)RNN(下集) 同步多对多结构 1)结构详解 ①图解: ②参数含义: x t x_t xt​ :表示每一个时刻的输入; o t o_t ot​ :表示每一个时刻的输…...

Python Web 框架 Django、Flask 和 FastAPI 对比

在探索 Python Web 框架时,Django、Flask 和 FastAPI 无疑是最常被提及的名字。根据我们最新的 Python 开发者调查,这三大框架继续稳坐后端 Web 开发的热门宝座。它们均为开源项目,并且与 Python 的最新版本无缝兼容。然而,面对不…...

Hyperlane 似乎是一个轻量级、高性能的 Rust HTTP 服务器库

关键要点 Hyperlane 是一个轻量级、高性能的 Rust HTTP 服务器库,适合简化网络服务开发。它支持 HTTP 请求解析、响应构建、TCP 通信,并提供中间件、WebSocket 和服务器发送事件(SSE)功能。安装通过 cargo add hyperlane 完成&am…...

【计算机网络运输层详解】

文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议:TCP 和 UDP1. TCP:面向连接的可靠传输协议2. UDP:无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…...

UR5e机器人位姿

UR5e 作为一款 6 自由度协作机器人,其末端执行器的位姿(位置与姿态的组合)控制是实现精准操作的核心。在笛卡尔坐标系中,位姿通常用齐次变换矩阵表示,包含末端的三维位置(x, y, z)和三维姿态&am…...

导入 Excel 规则批量修改或删除 PDF 文档内容

需要对 PDF 文档内容进行修改的时候,通常我们会需要借助一些专业的工具来帮我们完成。那我们如果需要修改的 PDF 文档较多的时候,有什么方法可以帮我们实现批量操作呢?今天这篇文章就给大家介绍一下当我们需要批量修改多个 PDF 文档的时候&am…...

大模型tokenizer重构流程

大模型tokenizer层再训练(选取Qwen7B试验,重构token层) 最近公司可能想训练一个蛋白质大模型,需要了解一下大模型tokenizer重构,之后可能要训练,这里做了一定的总结。 文章目录 1. 首先查看Qwen2.5 7B基本…...

JAVA线程安全的集合类分类

1. 传统同步集合类(早期实现,性能较低)‌ ‌Vector‌ 动态数组实现,所有方法通过 synchronized 同步锁保证线程安全‌。 ‌Stack‌ 继承自 Vector,实现后进先出(LIFO)堆栈,同步锁机…...

ISIS-1 ISIS概述

前面几章我们介绍了OSPF的基础工作原理以及怎样交互LSA形成LSDB链路状态数据库的 这一章我们来介绍另一个链路状态路由协议,ISIS路由协议 一、概述 ISIS(Intermediate System to Intermediate System,中间系统到中间系统)是由ISO(International Organization for Standardiza…...

茱元游戏TV2.9.3 | 适配多设备的经典街机游戏集合

茱元游戏TV是一款专为TV端设计的游戏软件,同时适配手机、投影仪和车机等多种设备。尽管其兼容性一般,仅支持安卓9.0以上系统,但它提供了丰富的经典街机游戏资源,非常适合8090后怀旧游玩。注意,游戏需先下载才能玩&…...

RTD2525BE《HDMI转EDP,DP转EDP》显示器芯片

一、产品概述 瑞昱RTD2525BE是一款专为高端显示设备设计的多接口转换芯片,支持HDMI 2.0与DisplayPort(DP)1.4双输入,并高效转换为嵌入式DisplayPort(eDP)输出。该芯片集成先进信号处理技术,支持…...

SvelteKit 最新中文文档教程(10)—— 部署 Cloudflare Pages 和 Cloudflare Workers

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...

springboot使用阿里限流框架-sentinel

当前项目源码 控制台下载 启动bin中的看板服务&#xff1a;账号密码:sentinel/sentinel 官方文档地址 项目引入依赖 <!-- sentinel注解支持 --> <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj<…...

鸿蒙特效教程10-卡片展开/收起效果

鸿蒙特效教程10-卡片展开/收起效果 在移动应用开发中&#xff0c;卡片是一种常见且实用的UI元素&#xff0c;能够将信息以紧凑且易于理解的方式呈现给用户。 本教程将详细讲解如何在HarmonyOS中实现卡片的展开/收起效果&#xff0c;通过这个实例&#xff0c;你将掌握ArkUI中状…...

Qt在模块依靠情况下资源文件名称和资源名称的使用限制

概述 在Qt中使用添加资源文件的时候&#xff0c;对于资源文件名称的定义&#xff0c;往往是较为随意的。 但是当涉及到Qt库依赖的时候&#xff0c;则可能需要遵守一定的规则&#xff0c;否则可能出现文件找不到或者错误加载的问题。 环境 环境名称Qt 版本系统版本LinuxQt 5.…...

MTK Android12-Android13 设置系统默认语言

Android 系统&#xff0c;默认语言 文章目录 需求&#xff1a;场景 参考资料实现方案实现思路编译脚本熟悉-平台熟悉mssi_64_cnkernel-4.19 解决方案修改文件-实现方案 源码分析PRODUCT_LOCALES 引用PRODUCT_DEFAULT_LOCALE 定义get-default-product-locale 方法定义PRODUCT_DE…...

【003安卓开发方案调研】之ReactNative技术开发安卓

基于2025年最新行业动态和搜索资料&#xff0c;以下是针对国内使用React Native&#xff08;RN&#xff09;开发安卓应用的深度分析&#xff1a; 一、技术成熟度评估 1. 核心架构升级 新架构全面普及&#xff1a;2024年起&#xff0c;React Native的 新架构&#xff08;Fabri…...

CSS3学习教程,从入门到精通,CSS3 浮动与清除浮动语法知识点及案例代码(14)

CSS3 浮动与清除浮动语法知识点及案例代码 一、浮动基础 浮动语法 选择器 {float: left|right|none|initial|inherit; }left&#xff1a;元素向左浮动。right&#xff1a;元素向右浮动。none&#xff1a;默认值&#xff0c;元素不浮动。initial&#xff1a;使用默认值。inhe…...

贪心算法——思路与例题

贪心算法&#xff1a;当我们分析一个问题时&#xff0c;我们往往先以最优的方式来解决问题&#xff0c;所以顾名思义为贪心。 例题1 题目分析&#xff1a;这题利用贪心算法来分析&#xff0c;最优解&#xff08;可容纳人数最多时&#xff09;一定是先考虑六人桌&#xff0c;然…...

网络华为HCIA+HCIP 防火墙

防火墙部署模式 路由模式 有路由器的功能 路由器干的活 他都得干 透明模式 旁挂模式 IDS 端口镜像 VPN...

WordPress超级菜单插件UberMenu v3.78汉化版

一、插件介绍 UberMenu 是一款功能强大的 WordPress 超级菜单插件,能够帮助站长创建响应式、可自定义的多级菜单。该插件支持动态内容加载、图标、图片、搜索框等丰富功能,并且兼容大多数 WordPress 主题。 UberMenu v3.78 经过完整汉化,适用于中文站点用户,让操作更加直观…...

SQL中体会多对多

我们可以根据学生与课程多对多关系的数据库模型&#xff0c;给出实际的表数据以及对应的查询结果示例&#xff0c;会用到JOINLEFT JOIN两种连接 1. 学生表&#xff08;students&#xff09; student_idstudent_name1张三2李四3王五 2. 课程表&#xff08;courses&#xff09…...

23种设计模式-备忘录(Memento)设计模式

备忘录设计模式 &#x1f6a9;什么是备忘录设计模式&#xff1f;&#x1f6a9;备忘录设计模式的特点&#x1f6a9;备忘录设计模式的结构&#x1f6a9;备忘录设计模式的优缺点&#x1f6a9;备忘录设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…...