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中的vertAddfragAdd

以下是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)特性,包含金属度、粗糙度等完整材质属性计算‌

标准版之前看过,现在看看简化版的


引用了UnityStandardCoreForwardSimple.cgincvertForwardAddSimplefragForwardAddSimpleInternal

二、vertForwardAddSimple

struct VertexOutputForwardAddSimple
{UNITY_POSITION(pos);float4 tex                          : TEXCOORD0;float3 posWorld                     : TEXCOORD1;#if !defined(_NORMALMAP) && SPECULAR_HIGHLIGHTSUNITY_FOG_COORDS_PACKED(2, half4) // x: fogCoord, yzw: reflectVec
#elseUNITY_FOG_COORDS_PACKED(2, half1)
#endifhalf3 lightDir                      : TEXCOORD3;#if defined(_NORMALMAP)#if SPECULAR_HIGHLIGHTShalf3 tangentSpaceEyeVec        : TEXCOORD4;#endif
#elsehalf3 normalWorld                   : TEXCOORD4;
#endifUNITY_LIGHTING_COORDS(5, 6)UNITY_VERTEX_OUTPUT_STEREO
};VertexOutputForwardAddSimple vertForwardAddSimple(VertexInput v)
{// 定义输出结构体VertexOutputForwardAddSimple o;// 设置实例ID,确保多实例渲染正确工作UNITY_SETUP_INSTANCE_ID(v);// 初始化输出结构体的成员变量UNITY_INITIALIZE_OUTPUT(VertexOutputForwardAddSimple, o);// 初始化立体视图输出(如果需要)UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);// 将顶点从对象空间转换到世界空间float4 posWorld = mul(unity_ObjectToWorld, v.vertex);// 将顶点从对象空间转换到裁剪空间(用于最终渲染)o.pos = UnityObjectToClipPos(v.vertex);// 获取纹理坐标o.tex = TexCoords(v);// 存储世界空间中的顶点位置o.posWorld = posWorld.xyz;// 传递阴影和光照信息UNITY_TRANSFER_LIGHTING(o, v.uv1);// 计算光照方向向量half3 lightDir = _WorldSpaceLightPos0.xyz - posWorld.xyz * _WorldSpaceLightPos0.w;// 如果不是使用方向光,则对光照方向进行归一化#ifndef USING_DIRECTIONAL_LIGHTlightDir = NormalizePerVertexNormal(lightDir);#endif// 如果启用了镜面高光效果,计算视线方向向量#if SPECULAR_HIGHLIGHTShalf3 eyeVec = normalize(posWorld.xyz - _WorldSpaceCameraPos);#endif// 将法线从对象空间转换到世界空间half3 normalWorld = UnityObjectToWorldNormal(v.normal);// 如果启用了法线贴图#ifdef _NORMALMAP// 如果启用了镜面高光效果#if SPECULAR_HIGHLIGHTS// 调用 TangentSpaceLightingInput 函数,将光照方向和视线方向转换到切线空间TangentSpaceLightingInput(normalWorld, v.tangent, lightDir, eyeVec, o.lightDir, o.tangentSpaceEyeVec);#else// 如果未启用镜面高光效果,忽略视线方向half3 ignore;TangentSpaceLightingInput(normalWorld, v.tangent, lightDir, 0, o.lightDir, ignore);#endif#else// 如果未启用法线贴图,直接使用光照方向o.lightDir = lightDir;o.normalWorld = normalWorld;// 如果启用了镜面高光效果,计算反射向量并存储在 fogCoord 中#if SPECULAR_HIGHLIGHTSo.fogCoord.yzw = reflect(eyeVec, normalWorld);#endif#endif// 传递雾效信息UNITY_TRANSFER_FOG(o, o.pos);// 返回输出结构体return o;
}

三、vertForwardAddSimple和vertForwardAdd对比

以下是 vertForwardAddSimplevertForwardAdd 两个顶点着色器函数的主要区别,分条列举如下:

1. 输出结构体类型

  • vertForwardAddSimple:使用 VertexOutputForwardAddSimple 作为输出结构体。

  • vertForwardAdd: 使用 VertexOutputForwardAdd 作为输出结构体。

2. 雾效处理方式

  • vertForwardAddSimple:使用 UNITY_TRANSFER_FOG 来传递雾效信息。

     UNITY_TRANSFER_FOG(o,o.pos);
    
  • vertForwardAdd:使用 UNITY_TRANSFER_FOG_COMBINED_WITH_EYE_VEC 来传递雾效信息。这个宏通常用于结合视线方向的雾效计算。

    UNITY_TRANSFER_FOG_COMBINED_WITH_EYE_VEC(o, o.pos);
    

3. 法线和切线空间处理

  • vertForwardAddSimple:根据是否启用了 _NORMALMAP 宏来决定如何处理法线和切线空间。

    #ifdef _NORMALMAP#if SPECULAR_HIGHLIGHTSTangentSpaceLightingInput(normalWorld, v.tangent, lightDir, eyeVec, o.lightDir, o.tangentSpaceEyeVec);#elsehalf3 ignore;TangentSpaceLightingInput(normalWorld, v.tangent, lightDir, 0, o.lightDir, ignore);#endif#elseo.lightDir = lightDir;o.normalWorld = normalWorld;#if SPECULAR_HIGHLIGHTSo.fogCoord.yzw = reflect(eyeVec, normalWorld);#endif#endif
    
  • vertForwardAdd:根据是否启用了 _TANGENT_TO_WORLD 宏来决定如何处理法线和切线空间。

     #ifdef _TANGENT_TO_WORLDfloat4 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];#elseo.tangentToWorldAndLightDir[0].xyz = 0;o.tangentToWorldAndLightDir[1].xyz = 0;o.tangentToWorldAndLightDir[2].xyz = normalWorld;#endif
    

4. 视图方向(视线方向)处理

  • vertForwardAddSimple: 仅在启用了 SPECULAR_HIGHLIGHTS 宏时计算视线方向 (eyeVec)

    #if SPECULAR_HIGHLIGHTShalf3 eyeVec = normalize(posWorld.xyz - _WorldSpaceCameraPos);#endif
    
  • vertForwardAdd:始终计算视线方向 (eyeVec) ,无论是否启用了 SPECULAR_HIGHLIGHTS

     o.eyeVec.xyz = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
    

5. 光照方向处理

  • vertForwardAddSimple:计算光照方向 (lightDir) 存储在lightDir 。

    half3 lightDir = _WorldSpaceLightPos0.xyz - posWorld.xyz * _WorldSpaceLightPos0.w;
    #ifndef USING_DIRECTIONAL_LIGHTlightDir = NormalizePerVertexNormal(lightDir);
    #endif#ifdef _NORMALMAP
    #elseo.lightDir = lightDir;
    #endif
    
  • vertForwardAdd: 计算光照方向存储在tangentToWorldAndLightDir

       float3 lightDir = _WorldSpaceLightPos0.xyz - posWorld.xyz * _WorldSpaceLightPos0.w;#ifndef USING_DIRECTIONAL_LIGHTlightDir = NormalizePerVertexNormal(lightDir);#endifo.tangentToWorldAndLightDir[0].w = lightDir.x;o.tangentToWorldAndLightDir[1].w = lightDir.y;o.tangentToWorldAndLightDir[2].w = lightDir.z;
    

6. 附加功能支持

  • vertForwardAddSimple:不包含对视差贴图的支持。

  • vertForwardAdd:包含对视差贴图的支持。

     #ifdef _PARALLAXMAPTANGENT_SPACE_ROTATION;o.viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));#endif
    

7. 初始化和设置

  • vertForwardAddSimple

    • 初始化输出结构体 VertexOutputForwardAddSimple,并设置实例 ID 和立体视图输出。
  • vertForwardAdd

    • 初始化输出结构体 VertexOutputForwardAdd,并设置实例 ID 和立体视图输出。

8. 细节处理

  • vertForwardAddSimple

    • 在未启用 _NORMALMAP 的情况下,直接将法线存储在 o.normalWorld 中,并在启用了 SPECULAR_HIGHLIGHTS 时计算反射向量。

       #ifdef _NORMALMAP//......#elseo.lightDir = lightDir;o.normalWorld = normalWorld;#if SPECULAR_HIGHLIGHTSo.fogCoord.yzw = reflect(eyeVec, normalWorld);#endif#endif
      
  • vertForwardAdd

    • 在未启用 _TANGENT_TO_WORLD 的情况下,将法线存储在 o.tangentToWorldAndLightDir[2].xyz 中,并不进行额外的反射向量计算。

      #ifdef _TANGENT_TO_WORLD//......
      #elseo.tangentToWorldAndLightDir[0].xyz = 0;o.tangentToWorldAndLightDir[1].xyz = 0;o.tangentToWorldAndLightDir[2].xyz = normalWorld;
      #endif
      

总结

特性/功能vertForwardAddSimplevertForwardAdd
输出结构体VertexOutputForwardAddSimpleVertexOutputForwardAdd
雾效处理UNITY_TRANSFER_FOGUNITY_TRANSFER_FOG_COMBINED_WITH_EYE_VEC
法线和切线空间处理根据 _NORMALMAP 处理根据 _TANGENT_TO_WORLD 处理
视线方向处理仅在 SPECULAR_HIGHLIGHTS 时计算始终计算并存储
光照方向处理直接存储或传递给 TangentSpaceLightingInput分别存储在 tangentToWorldAndLightDir.w 分量中
支持视差贴图是 (通过 _PARALLAXMAP 宏)
反射向量计算SPECULAR_HIGHLIGHTS 时计算不计算

四、fragForwardAddSimpleInternal

half4 fragForwardAddSimpleInternal (VertexOutputForwardAddSimple i)
{// 应用抖动交叉淡入效果,以减少在低分辨率下可能出现的锯齿现象。UNITY_APPLY_DITHER_CROSSFADE(i.pos.xy);// 根据传入的顶点信息,设置片段的基本材质属性(如漫反射颜色、镜面反射颜色和平滑度)。FragmentCommonData s = FragmentSetupSimpleAdd(i);// 计算直接光源下的BRDF(双向反射分布函数),考虑了材质的漫反射颜色、镜面反射颜色和平滑度以及视角与光方向之间的关系。half3 c = BRDF3DirectSimple(s.diffColor, s.specColor, s.smoothness, dot(REFLECTVEC_FOR_SPECULAR(i, s), i.lightDir));// 如果启用了镜面高光,则将计算出的颜色乘以光源的颜色,否则使用预乘了光颜色的diffColor。#if SPECULAR_HIGHLIGHTS // else diffColor has premultiplied light colorc *= _LightColor0.rgb;#endif// 获取当前片段的光照衰减,并将其应用于颜色值上。同时,根据法线和光方向间的夹角调整最终颜色强度。UNITY_LIGHT_ATTENUATION(atten, i, s.posWorld)c *= atten * saturate(dot(LightSpaceNormal(i, s), i.lightDir));// 应用雾效,使得物体在远处时逐渐融合到背景色中。这里特别地,雾效会趋向于黑色。UNITY_APPLY_FOG_COLOR(i.fogCoord, c.rgb, half4(0,0,0,0)); // fog towards black in additive pass// 返回最终的颜色结果,包括alpha通道的信息。return OutputForward (half4(c, 1), s.alpha);
}

五、fragForwardAddSimpleInternal和fragForwardAddInternal对比

以下是 fragForwardAddSimpleInternalfragForwardAddInternal 两个片段着色器函数的主要区别,如下:

1. 输入参数类型

  • fragForwardAddSimpleInternal 接受的参数类型是 VertexOutputForwardAddSimple
  • fragForwardAddInternal 接受的参数类型是 VertexOutputForwardAdd

2. 材质属性设置

  • fragForwardAddSimpleInternal 使用 FragmentSetupSimpleAdd(i) 来设置基本的材质属性(如漫反射颜色、镜面反射颜色和平滑度)。
  • fragForwardAddInternal 使用 FRAGMENT_SETUP_FWDADD(s) 来设置材质属性,并且包含更多的细节处理(如视角向量和法线向量)。

3. 光照计算方法

  • fragForwardAddSimpleInternal 使用 BRDF3DirectSimple 函数来计算直接光照下的颜色贡献。这个函数相对简单,只考虑了基本的BRDF计算。
  • fragForwardAddInternal 使用 UNITY_BRDF_PBS 函数来进行更复杂的物理基础渲染(PBR)计算,包括漫反射和镜面反射的组合,并考虑了间接光照(虽然这里设为 noIndirect)。

4. 光源衰减和法线方向处理

  • fragForwardAddSimpleInternal 直接使用 UNITY_LIGHT_ATTENUATION(atten, i, s.posWorld) 获取光源衰减,并通过 saturate(dot(LightSpaceNormal(i, s), i.lightDir)) 计算法线与光方向之间的夹角影响最终颜色。
  • fragForwardAddInternal 在获取光源衰减后,使用 AdditiveLight (IN_LIGHTDIR_FWDADD(i), atten) 创建一个 UnityLight 结构体,包含了光源方向和衰减信息。

5. 立体视觉支持

  • fragForwardAddSimpleInternal 没有涉及立体视觉的支持。
  • fragForwardAddInternal 包含了对立体视觉的支持,通过 UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); 来设置立体眼索引。

6. 雾效应用

  • fragForwardAddSimpleInternal 使用 UNITY_APPLY_FOG_COLOR(i.fogCoord, c.rgb, half4(0,0,0,0)); 直接应用雾效。
  • fragForwardAddInternal 首先通过 UNITY_EXTRACT_FOG_FROM_EYE_VEC(i); 提取雾坐标,然后使用 UNITY_APPLY_FOG_COLOR(_unity_fogCoord, c.rgb, half4(0,0,0,0)); 应用雾效。

7. 输出函数调用

  • fragForwardAddSimpleInternal 最终调用 OutputForward (half4(c, 1), s.alpha); 返回结果。
  • fragForwardAddInternal 最终调用 OutputForward (c, s.alpha); 返回结果,注意这里的 c 已经是一个 half4 类型。

总结来说,fragForwardAddSimpleInternal 更加简化,适用于基本的光照和材质计算;而 fragForwardAddInternal 则提供了更复杂和全面的物理基础渲染(PBR),并且支持更多高级特性如立体视觉等。这两者的选择取决于具体的渲染需求和性能考量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91293.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91293.shtml

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

相关文章

第十九周-文档数据库MongoDB、消息队列和微服务

1. 完成redis单机安装,哨兵模式安装,主从安装,集群安装单机安装#安装依赖包 [rootcentos8~]#yum -y install gcc make jemalloc-devel #如果支持systemd需要安装下面包 [rootubuntu2204 ~]#apt update && apt -y install make gcc li…

C++中sizeof运算符全面详解和代码示例

sizeof 是 C 中的一个编译时运算符,用于获取对象或类型所占的字节数(以 size_t 返回)。它是掌握底层内存模型、结构体对齐、数组大小计算等的重要工具。1. 基本语法 sizeof(type) // 获取类型的大小 sizeof expression // 获取表达式结果…

内容中台:在一个地方管理多渠道内容

在数字化竞争愈演愈烈的今天,企业官网、社交平台、移动应用、邮件营销等渠道已成为品牌触达用户的关键接口。内容仍是连接企业与客户的核心资产。然而,内容创作与分发的复杂性持续攀升,多平台运营面临重复维护、更新不一致、资源冗余等诸多挑…

【刷题】东方博宜oj 1307 - 数的计数

样例输入&#xff1a; 6输出&#xff1a; 16 26 126 36 136原版是直接输出总数量&#xff0c;但我修改了一些&#xff0c;输出所有的新数。 #include <iostream> #include <vector> #include <string> using namespace std; //int c; void g(int num, string…

阿里云AI代码助手通义灵码开发指导

与阿里云一起轻松实现数智化让算力成为公共服务&#xff1a;用大规模的通用计算&#xff0c;帮助客户做从前不能做的事情&#xff0c;做从前做不到的规模。让数据成为生产资料&#xff1a;用数据的实时在线&#xff0c;帮助客户以数据为中心改变生产生活方式创造新的价值。智能…

设计模式(二十三)行为型:模板方法模式详解

设计模式&#xff08;二十三&#xff09;行为型&#xff1a;模板方法模式详解模板方法模式&#xff08;Template Method Pattern&#xff09;是 GoF 23 种设计模式中的行为型模式之一&#xff0c;其核心价值在于定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中实…

Postgresql 查询使用正则

今天接到任务&#xff0c;要从数据库中查询数据&#xff0c;对于postgresql 我并不熟悉&#xff0c;问了百度&#xff0c;问了通义千问。发现Postgresql 在写query sql 的时候&#xff0c;可以使用正则匹配&#xff0c;不单是使用like 这种关键字。我像发现了新大陆一样的兴奋。…

【WRF-Chem Emissions教程第八期】转换实用程序

转换实用程序 8.1 将中间二进制文件转换为 WRF-Chem 数据文件 文件命名规范与风格 8.2 Binary data file format(中间二进制排放数据文件的格式和结构) FORTRAN 示例程序说明 8.3 Building the WRF-Chemistry emissions conversion code 编译步骤 验证编译结果 8.4 Namelist …

Qt Ribbon效果界面

实现效果&#xff1a;头文件&#xff1a;#pragma once #include <QMdiArea> #include <QMdiSubWindow> #include <QMainWindow> #include "ui_MainFrame1.h" #include "DockManager.h" #include "DockAreaWidget.h"class Main…

如何修改 MySQL 8.0 的密码,和忘记密码时如何修改

要修改 MySQL 8.0 的密码&#xff0c;可以通过以下几种方法实现&#xff1a;方法 1&#xff1a;使用 ALTER USER 命令&#xff08;推荐&#xff09;这是 MySQL 8.0 推荐的修改密码方式&#xff1a;-- 修改当前登录用户的密码 ALTER USER USER() IDENTIFIED BY 新密码;-- 修改指…

图像处理控件Aspose.Imaging教程:使用 C# 编程将 CMX 转换为 PNG

PNG图像文件格式是广泛使用的图像格式之一。这种图像文件格式提供了增强的共享和显示功能。另一方面&#xff0c;CMX也是 Corel 应用程序主要使用的图像文件格式。然而&#xff0c;将 CMX 转换为 PNG 可以帮助用户在网络上查看和共享文件。因此&#xff0c;在本指南中&#xff…

迪丽热巴写真壁纸

下载&#xff1a;https://pan.quark.cn/s/a740dbac8274迪丽热巴绝美写真&#xff0c;高清壁纸展现独特魅力&#xff0c;每一张都是视觉盛宴

C++11 std::function 详解:通用多态函数包装器

在C11标准中&#xff0c;引入了std::function这一通用多态函数包装器&#xff0c;定义于<functional>头文件中。它彻底改变了C中函数对象的使用方式&#xff0c;为不同类型的可调用实体提供了统一的接口。std::function能够存储、复制和调用任何可复制构造的可调用目标&a…

Kafka运维实战 16 - kafka 分区重新分配【实战】

💻 Kafka运维实战 (17篇) 📝Kafka运维实战 17 - kafka 分区副本从 1 增加到 3【实战】 📝Kafka运维实战 16 - kafka 分区重新分配【实战】 📝Kafka运维实战 15 - kafka 重设消费者组位移入门和实战【实战】 📝Kafka运维实战 14 - kafka消费者组消费进度(Lag)深入理…

智汇AI,应用领航 | 华宇万象问数入选2025全景赋能典型案例

7月29日&#xff0c;以“AI城市&#xff1a;数启新纪元”为主题中关村人工智能与未来城市论坛在中关村国家自主创新示范区展示中心举办。本次论坛围绕人工智能创新应用落地实践、新型数据基础设施建设、数据要素价值释放机制、城市智能治理等关键议题&#xff0c;邀请院士专家和…

sqli-labs:Less-7关卡详细解析

1. 思路&#x1f680; 本关的SQL语句为&#xff1a; $sql"SELECT * FROM users WHERE id(($id)) LIMIT 0,1";注入类型&#xff1a;字符串型&#xff08;单引号、双括号包裹&#xff09;提示&#xff1a;参数id需以))闭合 同样无法像常规一样回显&#xff0c;php输出语…

编程算法:从理论基石到产业变革的核心驱动力

文章目录 算法的本质与效率衡量 基础算法范式的实践价值 排序算法的演进与选择 动态规划的实用技巧 算法在现代技术栈中的应用 大数据处理的算法框架 编译器中的算法优化 算法驱动的产业变革 金融领域的算法应用 医疗健康领域的算法创新 制造业的算法优化 算法的未来趋势 结语 …

深度学习中的注意力机制:原理、应用与未来展望

在人工智能领域&#xff0c;深度学习技术已经取得了巨大的突破&#xff0c;而注意力机制&#xff08;Attention Mechanism&#xff09;作为深度学习中的一个重要概念&#xff0c;正在逐渐改变我们对模型的理解和应用。本文将深入探讨注意力机制的原理、在不同领域的应用以及未来…

LeetCode 4:寻找两个正序数组的中位数

LeetCode 4&#xff1a;寻找两个正序数组的中位数问题定义与核心挑战 给定两个有序&#xff08;升序&#xff09;数组 nums1 和 nums2&#xff0c;要求找到它们的中位数&#xff0c;且算法时间复杂度为 O(log(mn))&#xff08;m 和 n 分别是两个数组的长度&#xff09;。 中位数…

独立站如何吃掉平台蛋糕?DTC模式下的成本重构与利润跃升

一、成本结构革命&#xff1a;从「流量税」到「用户终身价值」亚马逊卖家需支付15%佣金12%广告费&#xff0c;导致每$100收入中平台抽成$27。而成熟独立站通过SEO&#xff08;自然流量占比超40%&#xff09;和社交媒体内容引流&#xff0c;将获客成本压缩至$8-$15。更关键的是用…