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
英文地址,請注明出處:http://en.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。更關鍵的是用…