Unity Shader編程】之渲染流程之深度及pass詳解

關于透明物體的渲染,首先需要了解以下部分

  1. 深度緩沖區
  2. 深度寫入
  3. 深度測試
  4. pass
  5. 渲染和深度測試的過程
  6. 深度測試和顏色混合過程

**

一,深度緩沖區

**
深度即物體距離相機的距離,深度寫入即是把物體的距離相機信息記錄下來,寫入一個名為深度緩沖區的

深度緩沖區解釋

深度緩沖區(Depth Buffer),也稱為Z緩沖區(Z Buffer),是計算機圖形渲染中一個非常重要的概念。它主要用于處理三維場景中物體之間的前后遮擋關系,確保最終畫面顯示的像素是正確可見的。

什么是深度緩沖區?

深度緩沖區是一個與幀緩沖區(Frame Buffer)大小相同的緩沖區。幀緩沖區負責存儲屏幕上每個像素的顏色信息,而深度緩沖區則存儲每個像素的深度信息。深度信息通常表示該像素對應的物體到攝像機的距離(在攝像機空間中的Z坐標)。

深度緩沖區的工作原理

在渲染一個三維場景時,渲染管線會為每個物體的像素計算一個深度值,并通過**深度測試(Depth Test)**來決定哪些像素應該被繪制。具體過程如下:

  1. 計算像素深度值
    當渲染一個物體時,渲染管線會計算該物體每個像素的深度值(Z值),表示該像素距離攝像機的遠近。

  2. 讀取深度緩沖區中的值
    對于屏幕上的每一個像素位置,渲染管線會檢查深度緩沖區中存儲的當前深度值。

二,深度寫入

前面的深度緩沖區,里面的深度值就是是否寫入是由unity shader來控制是否寫入進去,在深度緩沖區中,默認的無窮大的,只有開啟深度寫入之后,才會更新緩沖區里面的深度值,而是否開啟深入寫入,則是看你是否要覆蓋掉之前的像素,

什么情況下要開啟深度寫入?

在渲染場景時,是否開啟深度寫入取決于具體的渲染需求和物體的屬性。通常以下情況下需要開啟深度寫入:

  • 不透明物體渲染
    對于不透明物體,開啟深度寫入是默認且推薦的設置。渲染不透明物體時,深度寫入會更新深度緩沖區,記錄每個像素的深度信息。這樣可以確保物體之間的遮擋關系正確,例如近處的物體遮擋遠處的物體。如果不開啟深度寫入,后續渲染的物體可能會錯誤地覆蓋前面的物體,導致視覺上的遮擋錯誤。

  • 確保前后關系正確
    開啟深度寫入的主要目的是讓渲染管線能夠正確處理物體之間的前后關系。特別是在復雜的3D場景中,不透明物體需要依靠深度緩沖區來維護遮擋的正確性。

判斷是否應該開啟深度寫入的關鍵點是什么?

判斷是否開啟深度寫入的關鍵在于以下兩點:

  1. 物體的透明屬性

    • 不透明物體:需要開啟深度寫入。不透明物體不涉及顏色混合,渲染時需要更新深度緩沖區,以確保它們能正確遮擋其他物體。
    • 透明物體:通常關閉深度寫入。透明物體需要與背景或其他物體進行顏色混合,如果開啟深度寫入,可能會錯誤地阻擋后續物體的渲染,導致混合效果無法實現。
  2. 渲染需求

    • 如果渲染的目標是確保遮擋關系(如不透明物體之間的層次),則需要開啟深度寫入。
    • 如果渲染的目標是實現顏色混合(如透明物體的疊加效果),則需要關閉深度寫入。
為什么關閉深度寫入之后,不透明物體還能正常渲染混合?

關閉深度寫入后,不透明物體在某些情況下仍然可以正常渲染,甚至看似實現了“混合”,原因如下:

  • 深度測試依然生效
    關閉深度寫入并不意味著關閉深度測試。深度測試會根據深度緩沖區中的已有值判斷當前像素是否應該被繪制。只要深度測試通過,不透明物體的顏色就會覆蓋幀緩沖區中的顏色,而不會涉及真正的混合(Blending)。因此,如果深度緩沖區的初始值和渲染順序配置得當,不透明物體仍能按照預期顯示。

  • 渲染順序的影響
    如果不透明物體按照從前到后的順序渲染,即使關閉了深度寫入,后渲染的物體仍然可以覆蓋前面的像素。這種情況下,渲染結果可能看起來是正確的。但如果順序錯誤(例如從后到前),遮擋關系就會出現問題,導致視覺錯誤。

  • 混合設置未啟用
    不透明物體通常不使用混合功能(Blending),它們的顏色會直接覆蓋幀緩沖區中的像素。因此,即使關閉深度寫入,只要深度測試和渲染順序得當,渲染結果可能仍然正常。但這并不意味著不透明物體真正實現了“混合”,因為混合是指透明物體特有的顏色疊加效果。

為什么不推薦關閉深度寫入用于不透明物體?

盡管在特定條件下不透明物體關閉深度寫入仍能渲染,但這種做法不推薦,原因包括:

  • 遮擋錯誤風險:如果渲染順序不正確,后渲染的物體可能錯誤地覆蓋前面的物體,導致遮擋關系混亂。
  • 性能問題:關閉深度寫入可能導致更多的像素被繪制(過繪制),從而降低渲染效率。
  • 不可預測性:依賴渲染順序和深度測試的配置增加了復雜性,可能在不同場景下產生不可預測的結果。
總結
  • 開啟深度寫入適用于不透明物體,以確保正確的遮擋關系。
  • 關閉深度寫入適用于透明物體,以實現顏色混合效果。
  • 判斷的關鍵點是物體的透明屬性渲染需求
  • 關閉深度寫入后,不透明物體可能因深度測試和渲染順序而正常渲染,但這種配置不穩定且不推薦。

三,深度測試

在Unity中,深度測試(Depth Testing)是通過比較每個像素的深度值來判斷該像素是否應該被渲染的過程。每個像素有一個深度值,表示它距離觀察者的遠近。深度測試的目的是確保只有在正確的渲染順序下顯示物體,通常用于處理物體的遮擋關系。深度測試是默認開啟的,如果要關閉,繼續看下面

在Shader編程中,深度測試的判斷過程是由GPU自動完成的,但它是通過比較當前片段(像素)的深度值與深度緩沖區中已存在的深度值來進行的。
深度測試的基本工作流程:
深度值計算:每個片段(像素)在屏幕空間中都有一個深度值。這個深度值是通過將物體的3D坐標轉換到屏幕空間(通常是透視投影后)來得到的。

深度比較:深度測試會根據預設的深度比較函數(Depth Comparison Function)來決定該片段是否通過深度測試。常見的深度比較函數有:

  • Less(小于):如果當前片段的深度值小于緩沖區中的深度值,則該片段通過深度測試。

  • Greater(大于):如果當前片段的深度值大于緩沖區中的深度值,則該片段通過深度測試。

  • Equal(等于):如果當前片段的深度值等于緩沖區中的深度值,則該片段通過深度測試。

  • Lequal(小于等于):如果當前片段的深度值小于或等于緩沖區中的深度值,則該片段通過深度測試。

  • Gequal(大于等于):如果當前片段的深度值大于或等于緩沖區中的深度值,則該片段通過深度測試。

  • Never(從不):永遠不會通過深度測試。

  • Always(始終通過):總是通過深度測試。
    通過與否:如果當前片段通過深度比較(比如在使用“Less”時,當前片段的深度值小于緩沖區中的值),該片段就會被渲染出來,并且其深度值會被更新到深度緩沖區中;如果不通過,片段就會被丟棄,不會被渲染。

以上是深度測試的一些比較,來判斷是否通過深度測試,那么,是否有其他方式來控制深度測試是否通過
在Unity的Shader中,通常深度測試是由GPU自動進行的,但你確實可以通過一些設置來手動控制是否通過深度測試。這通常是通過改變 ZTestZWrite 的行為,或者直接控制深度緩沖區來實現的。

以下是幾種手動控制的方式:

1. 禁用深度測試(不進行深度比較)

你可以禁用深度測試,讓渲染過程不依賴深度緩沖區進行深度比較,完全不做遮擋判斷。這樣所有物體都會被渲染,不管它們是否被其他物體遮擋。

Shader "Custom/NoDepthTest"
{SubShader{Pass{// 禁用深度測試,所有片段都會通過ZTest Always// 禁用深度寫入,確保不會更新深度緩沖區ZWrite Off// 其他渲染設置CGPROGRAM// shader代碼ENDCG}}
}

ZTest Always 使得所有片段都通過深度測試,無論它們的深度值是多少。這意味著所有物體都會被渲染出來。

2. 完全關閉深度寫入

如果你只想禁用深度寫入,而依然保持深度測試,這樣就不會影響深度緩沖區的內容,但仍然會執行深度比較,允許物體依然受到遮擋影響。

Shader "Custom/NoDepthWrite"
{SubShader{Pass{ZTest Less    // 可以使用任何你想要的深度比較ZWrite Off    // 禁用深度寫入// 其他渲染設置CGPROGRAM// shader代碼ENDCG}}
}

在這種情況下,深度測試仍然存在,但是不會修改深度緩沖區,因此可能會出現一些不希望的渲染效果,比如物體不被正確遮擋。

3. 手動修改深度值

你可以在片段著色器中手動修改深度值。通過 SV_Position 中的 z 值(即深度值),你可以直接控制它,從而影響深度測試的結果。例如,改變 z 值來決定片段是否通過深度測試。

void frag(v2f i) : SV_Target
{float depth = i.pos.z / i.pos.w; // 計算深度// 手動設置深度值(注意:這里可能會影響后續的渲染,可能導致一些視覺問題)gl_FragDepth = depth;return color;
}

4. 通過Discard來手動丟棄片段

你可以在片段著色器中使用 discard 命令來手動丟棄某些片段,使其不通過渲染管線。這是一種直接控制哪些片段渲染、哪些片段丟棄的方式。通常結合自定義的深度條件來實現:

void frag(v2f i) : SV_Target
{if (i.pos.z > 0.5) // 你可以設置自己的條件來丟棄片段{discard; // 丟棄該片段}return color; // 渲染其他片段
}

5. 深度測試的替代方法:通過自定義遮擋判斷

如果你希望控制遮擋而不使用傳統的深度測試,可以通過其他方式來實現,比如通過自定義的屏幕空間遮擋算法、碰撞檢測等方法來決定是否渲染某個物體,而不依賴GPU的深度測試。

6. 在某些特定情況下繞過深度測試

比如在渲染透明物體時,通常你會關閉深度寫入,避免透明物體更新深度緩沖區。但深度測試通常仍然開啟。若透明物體只需依賴“無深度測試”或“深度比較”來控制順序,手動干預可以確保它們正確排序:

Shader "Custom/TransparentNoDepthTest"
{SubShader{Pass{// 關閉深度寫入,同時使用深度比較ZWrite OffZTest LEqualBlend SrcAlpha OneMinusSrcAlpha// 其他設置CGPROGRAM// shader代碼ENDCG}}
}

總結:

手動不通過深度測試的方式可以通過禁用深度測試、控制深度寫入、在片段著色器中使用 discard,或者手動修改深度值等方法來實現。你可以根據具體需要選擇其中一種或多種方式來控制渲染的行為。

你有什么具體的應用場景或效果需要實現嗎?我可以幫你提供更詳細的實現建議。

在物體通過測試之后才會進行深度寫入

四,pass

在Unity Shader中,?Pass? 是定義渲染操作的核心單元,每個Pass對應一次完整的繪制流程。以下是關于Pass的詳細解析:
在Unity Shader中,?Pass? 是定義渲染操作的核心單元,每個Pass對應一次完整的繪制流程。以下是關于Pass的詳細解析:

Pass的作用?
多次渲染疊加效果?:每個Pass執行一次物體渲染,多個Pass可疊加效果(如先繪制漫反射,再疊加高光)。
獨立配置渲染狀態?:每個Pass可自定義剔除、深度測試、混合模式等,實現不同階段的渲染需求。
支持不同光照模式?:通過LightMode標簽適配渲染路徑(如前向渲染中的主光源和附加光源)。
Pass的結構?
glsl
Copy Code
Pass {
// 1. 標簽(定義渲染階段)
Tags { “LightMode” = “ForwardBase” }

// 2. 渲染狀態配置
Cull Off
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha// 3. 著色器代碼
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// ... 頂點/片段著色器代碼
ENDCG

}

關鍵組成部分?

Tags?

控制Pass在渲染管線中的執行時機。常見標簽:
“LightMode”:指定光照模式(如ForwardBase、ForwardAdd、ShadowCaster)。
“Queue”:定義渲染順序(需謹慎使用,通常作用于SubShader層級)。
“RenderType”:用于Shader替換或后處理篩選。

渲染狀態?

Cull?:設置剔除模式(Back/Front/Off)。
ZWrite?:控制深度寫入(On/Off)。
Blend?:定義混合模式(如透明度混合)。
其他:ZTest、Stencil、ColorMask等。

著色器代碼?

使用CGPROGRAM或HLSLPROGRAM編寫頂點/片段著色器邏輯。
不同Pass可復用代碼,也可完全獨立。
Pass的類型?

常規Pass?
直接編寫渲染邏輯,處理顏色、光照等效果。

UsePass?
復用其他Shader中的Pass,需通過大寫名稱引用:

glsl
Copy Code
UsePass “ShaderName/PASS_NAME”

GrabPass?
抓取屏幕內容到紋理,用于折射、扭曲等效果:

glsl
Copy Code
GrabPass { “_MyGrabTexture” }

性能注意事項?
減少Pass數量?:過多的Pass會增加Draw Call,尤其在移動端需優化。
合并渲染邏輯?:盡量在單個Pass中完成復雜計算(如多光源處理)。
合理使用標簽?:避免不必要的渲染階段調用。
執行順序與繼承?
順序執行?:Pass按在Shader中的書寫順序依次執行。
狀態獨立性?:每個Pass的渲染狀態獨立配置,不繼承其他Pass的設置(默認值由Unity或SubShader定義)。
特殊用途Pass?
ShadowCaster?:生成深度紋理用于陰影計算。
MotionVectors?:處理運動模糊的移動矢量數據。
Deferred?:在延遲渲染路徑中處理GBuffer填充。
示例:多Pass疊加高光?
glsl
Copy Code
Shader “Custom/MultiPassExample” {
SubShader {
// Pass 1:基礎漫反射
Pass {
Tags { “LightMode” = “ForwardBase” }
CGPROGRAM
// 計算漫反射光照
ENDCG
}

    // Pass 2:附加高光Pass {Tags { "LightMode" = "ForwardAdd" }Blend One One // 疊加模式CGPROGRAM// 計算高光ENDCG}
}

}

通過合理設計Pass結構,開發者能實現復雜的渲染效果,同時平衡性能與視覺表現。理解Pass的配置和執行邏輯是掌握Unity Shader編寫的重要基礎。

在Unity中,渲染順序遵循?隊列分組執行?原則,而非按Pass連續執行。具體規則如下:

  1. 全局渲染流程?

階段一:渲染所有不透明物體(隊列 ≤ 2500)?

執行所有標記為"Queue"=“Geometry”(2000)、“Queue”=“AlphaTest”(2450)的物體。
執行順序?:從近到遠(Early-Z優化,減少Overdraw)?。
每個物體的Pass按Shader中的書寫順序執行,但?僅處理不透明Pass?(若存在多個Pass,需通過標簽控制)。

階段二:渲染所有透明物體(隊列 ≥ 3000)?

執行所有標記為"Queue"=“Transparent”(3000)的物體。
執行順序?:從遠到近(確保混合順序正確)?。
透明物體的Pass按Shader順序執行,但需關閉深度寫入(ZWrite Off)并啟用混合(如Blend)。
2. 跨物體Pass執行示例?

假設場景中有兩個物體:

物體A?:包含1個不透明Pass(隊列Geometry) + 1個透明Pass(隊列Transparent)。
物體B?:僅包含1個不透明Pass(隊列Geometry)。

實際渲染流程?:

plaintext
Copy Code

  1. 階段一(不透明物體):

    • 物體B的不透明Pass
    • 物體A的不透明Pass(若其隊列設為Geometry)
  2. 階段二(透明物體):

    • 物體A的透明Pass(若其隊列設為Transparent)
  3. 關鍵規則總結?
    行為? 是否允許 注意事項
    同一物體內混合不透明+透明Pass 允許,但需分屬不同隊列 需拆分材質,避免同一Shader同時處理兩種類型(否則隊列沖突)?
    透明Pass在不透明隊列執行 技術上可行,但會導致混合錯誤 透明效果可能被后續不透明物體覆蓋,需強制設為Transparent隊列?
    不透明Pass在透明隊列執行 不推薦 深度測試可能失效,破壞Early-Z優化

  4. 正確配置示例?
    場景需求?

一個角色同時包含不透明的盔甲和透明的護盾,需分別渲染。

Shader分拆方案?
glsl
Copy Code
// 盔甲材質(不透明)
Shader “Armor” {
SubShader {
Tags { “Queue” = “Geometry” }
Pass {
ZWrite On
// 不透明著色邏輯…
}
}
}

// 護盾材質(透明)
Shader “Shield” {
SubShader {
Tags { “Queue” = “Transparent” }
Pass {
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
// 透明著色邏輯…
}
}
}

  1. 常見錯誤與修復?
    錯誤現象?

透明物體被不透明物體遮擋,但期望顯示在前。

原因分析?
透明物體的隊列未設為Transparent(停留在默認的Geometry隊列)。
同一Shader中不透明與透明Pass未分拆,導致隊列沖突。
修復步驟?
將透明材質獨立為單獨Shader,設置"Queue"=“Transparent”。
確保透明Pass關閉深度寫入:ZWrite Off。
使用Frame Debugger驗證Draw Call順序。
6. 性能與質量權衡?
策略? 優點 缺點
分拆材質(推薦) 隊列清晰,避免混合沖突 增加Draw Call
同一Shader多Pass 減少Draw Call 需嚴格管理隊列標簽,易引發深度/混合問題
結論?

Unity的渲染順序?嚴格按隊列分組執行?,而非連續執行同一物體的所有Pass。要實現不透明與透明效果的正確疊加,必須:

將不透明與透明物體分屬不同隊列。
確保透明物體在Transparent隊列中按從遠到近渲染。
避免在同一Shader內混用不透明與透明Pass(除非明確控制隊列標簽)。

通過合理分拆材質與配置隊列,可確保渲染效果與性能的最佳平衡。

五,渲染和深度測試的過程

應用階段(CPU) → 頂點處理(GPU) → 光柵化(GPU) → 片元處理(含深度測試) → 幀緩沖輸出

六,深度測試和顏色混合過程

在渲染透明物體(如玻璃)時,涉及到深度測試和顏色混合的過程。以下是針對你問題的詳細解答:

渲染和深度測試的過程

  1. 墻的渲染

    • 墻是不透明物體,通常會先渲染。
    • 渲染時,墻的顏色會被寫入幀緩沖區,同時其深度值會被寫入深度緩沖區。
    • 墻開啟了深度寫入功能,確保后續物體在深度測試中能正確判斷前后關系。
  2. 玻璃的渲染

    • 玻璃是透明物體,通常在不透明物體(如墻)渲染完成后才進行渲染。
    • 玻璃關閉了深度寫入功能(即不會更新深度緩沖區),但會進行深度測試:
      • 如果玻璃的像素深度值小于深度緩沖區中的值(即玻璃在墻前面),通過深度測試,該像素會被繪制。
      • 如果玻璃的像素深度值大于深度緩沖區中的值(即玻璃在墻后面),不通過深度測試,該像素不會被繪制。

顏色混合的過程

當玻璃的像素通過深度測試(即確定在墻前面)時,它的顏色需要與幀緩沖區中已有的顏色(例如墻或背景的顏色)進行混合。這種混合并不是簡單相加,而是使用 Alpha Blending 技術。

Alpha Blending 的原理

Alpha Blending 是圖形渲染中最常用的透明混合方法。它通過透明度(Alpha 值)對兩種顏色進行加權混合:

  • 源顏色:玻璃的顏色,用 ((R_s, G_s, B_s)) 表示,Alpha 值為 (A_s)(范圍 0 到 1,0 表示完全透明,1 表示完全不透明)。
  • 目標顏色:幀緩沖區中已有的顏色(例如墻的顏色),用 ((R_d, G_d, B_d)) 表示。
  • 混合公式
    [
    R = R_s \times A_s + R_d \times (1 - A_s)
    ]
    [
    G = G_s \times A_s + G_d \times (1 - A_s)
    ]
    [
    B = B_s \times A_s + B_d \times (1 - A_s)
    ]
    最終顏色 ((R, G, B)) 是源顏色和目標顏色的加權和,權重由玻璃的 Alpha 值 (A_s) 決定。
舉個例子

假設:

  • 玻璃的顏色是淺藍色 ((R_s, G_s, B_s, A_s) = (0, 0.5, 1, 0.5))(Alpha 為 0.5 表示半透明)。
  • 墻的顏色是灰色 ((R_d, G_d, B_d) = (0.5, 0.5, 0.5))。
    混合后的顏色計算如下:
  • (R = 0 \times 0.5 + 0.5 \times (1 - 0.5) = 0 + 0.25 = 0.25)
  • (G = 0.5 \times 0.5 + 0.5 \times (1 - 0.5) = 0.25 + 0.25 = 0.5)
  • (B = 1 \times 0.5 + 0.5 \times (1 - 0.5) = 0.5 + 0.25 = 0.75)
    最終顏色為 ((0.25, 0.5, 0.75)),呈現出玻璃和墻顏色融合后的效果。

為什么不是簡單相加?

你可能會想,為什么不直接把玻璃的顏色和背景顏色相加(例如 (R_s + R_d, G_s + G_d, B_s + B_d))?原因如下:

  • 顏色溢出:簡單相加可能導致顏色值超過 1(例如 (0.5 + 0.6 = 1.1)),這在渲染中是不合法的,會導致不自然的效果。
  • 透明度失控:簡單相加無法反映玻璃的透明程度(Alpha 值),而 Alpha Blending 通過 (A_s) 和 (1 - A_s) 的權重,精確控制了玻璃對背景的“遮擋”程度,呈現出真實的透明感。

總結

  • 玻璃在墻前面時,通過深度測試的像素會被繪制。
  • 繪制時,玻璃的顏色與背景顏色通過 Alpha Blending 混合,而不是簡單相加。
  • 混合公式是加權和,權重由玻璃的 Alpha 值決定,確保透明效果自然且符合視覺預期。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73000.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

csv文件格式和excel數據格式有什么區別

CSV(Comma-Separated Values)和Excel(XLS/XLSX)數據格式的主要區別如下: 1. 文件格式 CSV:純文本格式,每一行表示一條記錄,字段之間用逗號(,)或其他分隔符&…

Beans模塊之工廠模塊注解模塊@Qualifier

博主介紹:?全網粉絲5W,全棧開發工程師,從事多年軟件開發,在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰,博主也曾寫過優秀論文,查重率極低,在這方面有豐富的經驗…

C# HTTP 文件上傳、下載服務器

程序需要管理員權限,vs需要管理員打開 首次運行需要執行以下命令注冊URL(管理員命令行) netsh advfirewall firewall add rule name"FileShare" dirin actionallow protocolTCP localport8000 ipconfig | findstr "IPv4&quo…

基于 TRIZ 理論的筏式養殖吊籠清洗裝備設計研究

基于 TRIZ 理論的筏式養殖吊籠清洗裝備設計研究 一、引言 筏式養殖在水產養殖業中占據重要地位,吊籠作為養殖貝類、藻類等生物的關鍵器具,其清潔程度直接影響養殖生物的健康與產量。傳統的吊籠清洗方式多依賴人工,效率低下、勞動強度大且清洗…

QA:備份產品的存儲架構采用集中式和分布式的優劣?

分布式和集中式各有優劣,且這兩者下面的存儲類型也都不盡相同,從備份與恢復的數據層面來看,這兩者存儲相結合才是優解。 眾所周知,備份數據只存一份還只放在一個存儲里是不現實的。假設把備份數據訪問頻率、生命周期等參數分為三個…

FPGA中串行執行方式之計數器控制

FPGA中串行執行方式之計數器控制 使用計數器控制的方式實現狀態機是一種簡單且直觀的方法。它通過計數器的值來控制狀態的變化,從而實現順序邏輯。計數器的方式特別適合狀態較少且狀態轉移是固定的場景。 基本原理 計數器控制的狀態機 ?例程1:簡單的順序狀態機 以下是一個…

純vue手寫流程組件

前言 網上有很多的vue的流程組件,但是本人不喜歡很多冗余的代碼,喜歡動手敲代碼;剛開始寫的時候,確實沒法下筆,最后一層一層剝離,總算實現了;大家可以參考我寫的代碼,可以拿過去定制…

數字化轉型驅動衛生用品安全革新

當315晚會上晃動的暗訪鏡頭揭露衛生巾生產車間里漂浮的異物、紙尿褲原料倉中霉變的碎屑時,這一觸目驚心的場景無情地撕開了“貼身安全”的遮羞布,暴露的不僅是部分企業的道德缺失,更凸顯了當前檢測與監管體系的漏洞,為整個行業敲響…

【C++】:異常

目錄 C語言處理錯誤的方式 C異常的概念 C異常的使用 異常的拋出與捕獲匹配原則 函數調用鏈中的棧展開 異常重新拋出 異常安全 異常規范 標準庫異常體系 自定義異常體系 異常的優缺點 C語言處理錯誤的方式 返回值檢查:函數返回特定錯誤碼或值標識失敗&am…

SZU軟件工程大學生涯 2022~2026

用于個人面試前自我介紹,防止忘記或談吐不流利。 面試官您好,我是來自深圳大學計算機與軟件學院的軟件工程專業的王雅賢。在校期間,我修讀了程序設計基礎、面向對象程序設計、數據結構、算法分析與設計、操作系統等核心課程,系統…

【JavaWeb學習Day27】

Tlias前端 員工管理 條件分頁查詢&#xff1a; 頁面布局 搜索欄&#xff1a; <!-- 搜索欄 --><div class"container"><el-form :inline"true" :model"searchEmp" class"demo-form-inline"><el-form-item label…

Linux 系統運行 Android 應用的幾種方案

這幾年&#xff0c;國產操作系統替代正在有條不紊地進行中。但生態是繞不過去的一道坎&#xff0c;指望應用廠商一下子完成國產系統適配也不現實。之前介紹過使用 Wine 運行 Windows 應用的方案&#xff0c;減少了國產系統應用偏少的難題。比如我在辦公室使用最多的企業微信&am…

Python進階教程丨lambda函數

1. lambda函數是什么&#xff1f; 在 Python 里&#xff0c;lambda 函數是一種特殊類型的函數&#xff0c;也被叫做匿名函數。匿名”意味著它不需要像常規函數那樣使用 def 來進行命名。lambda lambda 函數本質上是簡潔的臨時函數 &#xff0c;它適用于只需要簡單邏輯的場景&a…

TK矩陣系統:高效管理與智能化操作平臺

隨著TikTok等社交媒體平臺的快速發展&#xff0c;短視頻創作和內容運營逐漸成為互聯網行業的重要組成部分。為了幫助內容創作者、品牌運營商以及數據分析人員更高效地管理多個TikTok賬號并優化運營策略&#xff0c;TK矩陣系統提供了一種全新的解決方案&#xff0c;結合了先進的…

Spring Boot整合Apache BookKeeper教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Spring Boot整合Apache BookKeeper教程 1. 簡介 Apache BookKeeper 是一個高性能、持久化的分布式日志存儲系統&#xff0c;適用于需要強一致性和高吞吐量的…

蘋果HFS+56TB存儲MOV文件出錯的恢復方法

HFS文件系統是Apple電腦中默認的最常見的文件系統。HFS來源于UNIX&#xff0c;優勢就是穩定性&#xff0c;另外HFS是支持日志功能的&#xff0c;所以很多存儲設備也采用了HFS文件系統。再穩定的文件系統也有“馬失前蹄”的時候&#xff0c;下面就來聊下HFS出現文件出錯、丟失時…

電源電路篇

電源電路篇 一、LDO-Low Dropout Regulator(低壓差線性穩壓器)1.1 AMS1117-3.3V芯片 二、DCDC-Direct Current to Direct Current(開關穩壓器)2.1 降壓(Buck)電路2.1.1 TPS5450-5V芯片 一、LDO-Low Dropout Regulator(低壓差線性穩壓器) LDO是一種線性穩壓器&#xff0c;用于提…

java項目之在線購物系統(源碼+文檔)

項目簡介 在線購物系統實現了以下功能&#xff1a; 使用在線購物系統的用戶分管理員和用戶兩個角色的權限子模塊。 管理員所能使用的功能主要有&#xff1a;主頁、個人中心、用戶管理、商品分類管理、商品信息管理、系統管理、訂單管理等。 用戶可以實現主頁、個人中心、我的…

go語言中空結構體

空結構體(struct{}) 普通理解 在結構體中&#xff0c;可以包裹一系列與對象相關的屬性&#xff0c;但若該對象沒有屬性呢&#xff1f;那它就是一個空結構體。 空結構體&#xff0c;和正常的結構體一樣&#xff0c;可以接收方法函數。 type Lamp struct{}func (l Lamp) On()…

Unity實現連連看連線效果

1.一個比較簡單的向量計算&#xff0c;用的LineRenderer實現&#xff1b; 已知起始A點和終點C點&#xff0c;求B點&#xff1b; 先計算A點到C點的向量取歸一化當做方向&#xff0c;再給定一個“模長”&#xff08;B點到A點的模長&#xff09;乘以該方向&#xff0c;最后加上L…