在QT中使用OpenGL

參考資料:

主頁 - LearnOpenGL CN

https://blog.csdn.net/qq_40120946/category_12566573.html

由于OpenGL的大多數實現都是由顯卡廠商編寫的,當產生一個bug時通常可以通過升級顯卡驅動來解決。

OpenGL中的名詞解釋

OpenGL 上下文(Context)

  • 作用

    • OpenGL上下文就像是一個畫家的工具箱,它包含了所有當前可用的工具(如畫筆、顏料、畫布等),它存儲了OpenGL的所有狀態(如當前顏色、線條粗細、是否啟用混合等)。

    • 每個窗口/線程通常有一個獨立的上下文,每個上下文是獨立的,就像一個“沙盒”,不同上下文的資源默認不共享(除非顯式設置共享)。

    • 上下文必須綁定到某個“窗口”或“繪圖表面”(如HWNDQOpenGLWidget等),才能進行渲染。

為什么需要多個上下文?

多線程渲染(每個線程通常需要一個獨立的上下文)。

不同窗口可能需要不同的OpenGL版本(如一個用OpenGL 2.1,另一個用OpenGL 4.6)。

  • 例子

    • 如果你有兩個畫家(兩個OpenGL上下文),他們各自有自己的畫筆和顏料,互不影響。

    • 當你切換上下文(比如從窗口A切換到窗口B),就像換了一個畫家,他用的工具和之前的不一樣。

OpenGL 狀態機(State Machine)

OpenGL狀態機決定了當前如何繪制圖形,它由一系列可開關的設置組成,就像畫家的當前工作模式

  • 作用

    • 控制OpenGL的繪制行為,比如:

      • 當前顏色(glColor3f(1.0, 0.0, 0.0)?→ 紅色)

      • 是否啟用深度測試(glEnable(GL_DEPTH_TEST)

      • 當前綁定的紋理(glBindTexture(GL_TEXTURE_2D, textureId)

    • 這些狀態會一直保持,直到你手動改變它們。

  • 例子

    • 畫家當前選擇的是紅色顏料glColor3f(1.0, 0.0, 0.0)),那么接下來他畫的所有東西都是紅色,直到他換顏色。

    • 畫家決定是否使用尺子glEnable(GL_LINE_SMOOTH)),如果啟用,畫線會更平滑。

OpenGL (ObjectID)

對象ID(如VAOVBOTexture的ID)就像是工具箱里的每件工具的編號

  • 作用

    • OpenGL管理的資源(如緩沖區、紋理、著色器)都有一個唯一的GLuint類型的ID。

    • 你需要綁定(Bind)這些ID到OpenGL的某個目標(Target),才能使用它們。

  • 例子

    • 畫家有3支畫筆(3個VBO),編號分別是1、2、3。

    • 他必須拿起某支筆glBindBuffer(GL_ARRAY_BUFFER, vboId))才能用它畫畫。

    • 如果他不綁定任何筆(glBindBuffer(GL_ARRAY_BUFFER, 0)),就沒法畫。

著色器 ——?著色器 - LearnOpenGL CN

頂點著色器

核心作用:處理每個頂點的坐標變換和屬性計算。

  • 坐標變換:將輸入的頂點坐標(如模型空間坐標)轉換為裁剪空間坐標(Clip Space),這是透視投影和視口變換的基礎。
  • 屬性傳遞:處理頂點屬性(如位置、法線、紋理坐標、顏色),并將處理后的數據傳遞給后續階段(如幾何著色器或片段著色器)。
  • 應用場景
    • 實現模型的位移、旋轉、縮放(通過矩陣變換)。
    • 計算頂點光照效果的初始值(如法線變換)。
    • 實現頂點動畫(如骨骼動畫、波浪效果)。

特點

  • 對每個頂點執行一次,并行計算效率高。
  • 必須輸出裁剪空間坐標(gl_Position)。

// 頂點著色器示例(簡化)
#version 330 core
layout (location = 0) in vec3 aPosition; ?// 頂點位置
layout (location = 1) in vec3 aColor; ? ? // 頂點顏色
out vec3 vColor; ? ? ? ? ? ? ? ? ? ? ? ? ?// 傳遞給片段著色器的顏色

uniform mat4 model; ? ? ? // 模型矩陣
uniform mat4 view; ? ? ? ?// 視圖矩陣
uniform mat4 projection; ?// 投影矩陣

void main() {
? ? // 坐標變換:模型空間 → 世界空間 → 視圖空間 → 裁剪空間
? ? gl_Position = projection * view * model * vec4(aPosition, 1.0);
? ? vColor = aColor; ? ? ?// 傳遞顏色屬性
}

片段著色器

核心作用:計算每個片段(Fragment,可理解為潛在像素)的最終顏色。

  • 顏色計算:基于插值后的頂點屬性(如顏色、紋理坐標)和外部數據(如光照、材質、紋理),計算像素的 RGBA 值。
  • 高級效果:實現光照模型(如 Phong、PBR)、陰影、紋理采樣、透明度、后處理(如模糊、色調調整)。
  • 應用場景
    • 渲染物體材質和紋理。
    • 實現光照、反射、折射效果。
    • 創建特效(如霧效、發光、粒子)。

特點

  • 對每個光柵化后的片段執行一次,計算量通常比頂點著色器大。
  • 必須輸出一個顏色值(out vec4 FragColor)。

#version 330 core
in vec3 vColor; ? ? ? ? ? // 從頂點著色器接收的顏色
out vec4 FragColor; ? ? ? // 輸出的最終顏色

void main() {
? ? // 直接使用插值后的顏色
? ? FragColor = vec4(vColor, 1.0);
}

VBO(Vertex Buffer Object)—— 頂點緩沖區對象

VBO?是OpenGL中用于存儲頂點數據(如位置、顏色、紋理坐標等)的緩沖區對象。它直接在GPU內存中分配空間,避免CPU到GPU的重復數據傳輸,提高渲染效率。

作用

  • 存儲頂點屬性數據(例如:float vertices[] = {x1,y1,z1, x2,y2,z2, ...})。

  • 通過glBindBuffer綁定后,OpenGL才知道從哪里讀取數據。

類比

  • VBO = 顏料管

    • 每個顏料管(VBO)存儲一種原始數據(如紅色顏料管、藍色顏料管)。

    • 顏料管本身不知道如何被使用,只是數據的容器。

VAO(Vertex Array Object)—— 頂點數組對象

VAO?是一個“配置容器”,用于記錄:

  • 當前綁定的VBO。

  • 頂點屬性的解析方式(如位置是3個float,顏色是4個float等)。

  • 頂點屬性的啟用狀態(通過glEnableVertexAttribArray)。

作用

  • 避免重復配置:每次繪制時無需重新綁定VBO和設置屬性格式。

  • 提高性能:OpenGL可以直接讀取預定義的頂點數據布局。

類比

  • VAO = 調色板(或畫筆套裝)

    • 調色板(VAO)記錄了:

      • 哪些顏料管(VBO)被擠到調色板上。

      • 每種顏料的用途(如紅色用于輪廓,藍色用于填充)。

    • 畫家(OpenGL)拿起調色板后,直接知道如何作畫。

VBO 和 VAO 的聯系與區別

聯系

  1. VAO 依賴 VBO

    • VAO本身不存儲頂點數據,它只是記錄“如何從VBO中讀取數據”。

    • 必須先綁定VBO,再配置VAO(就像先擠顏料到調色板,再定義用途)。

區別

特性VBOVAO
存儲內容原始頂點數據(如位置、顏色)頂點屬性的配置(如何讀數據)
是否直接參與繪制是(數據源)否(只是數據格式的封裝)
綁定目標GL_ARRAY_BUFFER無目標(直接綁定)
性能優化減少CPU-GPU數據傳輸減少繪制時的狀態切換開銷

一個VAO綁定多個VBO嗎?——可以

VAO可以關聯多個VBO(例如:一個VBO存位置,另一個存顏色)。
只需在綁定VAO后,依次綁定不同VBO并配置屬性:

glBindVertexArray(vaoId);
// 綁定位置VBO
glBindBuffer(GL_ARRAY_BUFFER, vboPos);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
// 綁定顏色VBO
glBindBuffer(GL_ARRAY_BUFFER, vboColor);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, NULL);

基礎光照

環境光照(Ambient Lighting):

即使在黑暗的情況下,世界上通常也仍然有一些光亮(月亮、遠處的光),所以物體幾乎永遠不會是完全黑暗的。為了模擬這個,我們會使用一個環境光照常量,它永遠會給物體一些顏色。

漫反射光照(Diffuse Lighting):

模擬光源對物體的方向性影響(Directional Impact)。它是風氏光照模型中視覺上最顯著的分量。物體的某一部分越是正對著光源,它就會越亮。

鏡面光照(Specular Lighting):

模擬有光澤物體上面出現的亮點。鏡面光照的顏色相比于物體的顏色會更傾向于光的顏色。

法向量

法向量是一個垂直于頂點表面的(單位)向量。由于頂點本身并沒有表面(它只是空間中一個獨立的點),我們利用它周圍的頂點來計算出這個頂點的表面。我們能夠使用一個小技巧,使用叉乘對立方體所有的頂點計算法向量,但是由于3D立方體不是一個復雜的形狀,所以我們可以簡單地把法線數據手工添加到頂點數據中。更新后的頂點數據數組可以在這里找到。試著去想象一下,這些法向量真的是垂直于立方體各個平面的表面的(一個立方體由6個平面組成)。

計算漫反射光照需要什么?

  • 法向量:一個垂直于頂點表面的向量。
  • 定向的光線:作為光源的位置與片段的位置之間向量差的方向向量。為了計算這個光線,我們需要光的位置向量和片段的位置向量。

OpenGL 圖形渲染管線全流程解析

OpenGL 狀態機與對象管理基礎
  • 狀態機特性:OpenGL 通過上下文(Context)維護運行狀態,通過設置選項、操作緩沖修改狀態,以當前上下文執行渲染。
  • 對象引用機制:對象通過整數 ID(objectId)綁定至上下文目標位置,存儲選項配置,避免重復設置(如模型數據綁定)。
階段像素位置相關像素顏色相關
頂點著色器轉換 3D 坐標至裁剪空間,為投影做準備處理頂點顏色等屬性(可傳遞給片段著色器)
幾何著色器(可選)修改圖元形狀(如生成更多頂點)可輸出頂點顏色屬性
圖元裝配定義幾何形狀的輪廓無直接顏色處理
光柵化確定像素的屏幕坐標(x, y)傳遞片段位置給片段著色器
片段著色器無直接位置處理計算像素的 RGBA 顏色值
Alpha 測試與混合基于深度判斷像素可見性混合顏色值,確定最終顯示的顏色

數據流

一、像素位置的確定:3D 到 2D 坐標轉換與光柵化階段

1.?頂點著色器(Vertex Shader):初步坐標變換
  • 作用:將輸入的 3D 頂點坐標(如模型本地坐標)轉換為裁剪空間坐標(Clip Space),并完成頂點屬性(如位置、法線)的基礎處理。
  • 與像素位置的關系:此階段將頂點從模型空間映射到裁剪空間,為后續投影到 2D 屏幕做準備,但尚未直接確定像素位置。
2.?圖元裝配(Primitive Assembly):幾何形狀定義
  • 作用:將頂點按指定圖元類型(如三角形、線段)裝配成幾何形狀,確定渲染的基本單元(如一個三角形由 3 個頂點組成)。
  • 與像素位置的關系:明確了 3D 空間中幾何圖形的輪廓,但仍處于抽象的幾何階段。
3.?光柵化(Rasterization):像素位置生成
  • 作用:將圖元(如三角形)映射到屏幕的 2D 像素網格,計算每個圖元覆蓋的像素坐標,并生成對應的片段(Fragment)
  • 關鍵細節
    • 此階段通過插值計算圖元在屏幕上的覆蓋范圍,確定每個像素的位置(x, y 坐標)。
    • 裁切(Clipping)會丟棄視圖外的像素,減少無效計算。
  • 結論光柵化階段直接確定了像素的屏幕位置

二、像素顏色的計算:片段處理與最終輸出階段

1.?片段著色器(Fragment Shader):顏色值計算
  • 作用:接收光柵化生成的片段(包含位置、紋理坐標等信息),結合 3D 場景數據(如光照、陰影、材質屬性、紋理采樣),計算每個像素的最終顏色值(RGBA)。
  • 關鍵細節
    • 可通過光照模型(如蘭伯特、Phong)計算光照對顏色的影響。
    • 支持紋理采樣,將紋理貼圖的顏色映射到像素。
  • 結論片段著色器是像素顏色計算的核心階段
2.?Alpha 測試與混合(Alpha Test & Blending):顏色最終確定
  • 作用
    • 深度測試:比較當前片段與已渲染像素的深度值,決定是否保留當前像素(近物覆蓋遠物)。
    • Alpha 混合:根據透明度(Alpha 值)混合當前像素與背景像素的顏色,實現半透明效果(如玻璃、煙霧)。
  • 與顏色的關系:此階段不直接計算顏色,而是基于深度和 Alpha 值對片段著色器輸出的顏色進行篩選或混合,最終確定屏幕上顯示的像素顏色。
    圖形渲染管線核心流程拆解
    1. 3D 到 2D 坐標轉換階段

      • 頂點著色器(Vertex Shader):輸入單個頂點,將 3D 坐標轉換為特定空間坐標(如裁剪空間),并處理頂點屬性(如位置、顏色)。
      • 幾何著色器(Geometry Shader)(可選):輸入頂點組(圖元),通過生成新頂點擴展或修改圖元形狀(如從單個三角形生成兩個三角形)。
    2. 圖元裝配與光柵化階段

      • 圖元裝配(Primitive Assembly):將頂點按指定圖元類型(如三角形、點)裝配為幾何形狀,確定渲染基本單元。
      • 光柵化(Rasterization):將圖元映射為屏幕像素,生成片段(Fragment);裁切(Clipping)丟棄視圖外像素,提升效率。
    3. 片段處理與最終輸出階段

      • 片段著色器(Fragment Shader):計算像素最終顏色,結合 3D 場景數據(光照、陰影、材質等)生成顏色值。
      • Alpha 測試與混合(Alpha Test & Blending):通過深度 / 模板測試判斷像素可見性,基于 Alpha 值實現透明度混合,確定最終渲染結果。
    管線核心邏輯總結

    “狀態機管理對象狀態 → 管線各階段逐級處理頂點與圖元 → 從 3D 坐標映射至 2D 像素并渲染”,這一流程構成了 OpenGL 將幾何數據轉化為屏幕圖像的完整技術鏈路。

    完整OpenGL繪圖流程

    OpenGL步驟Qt (QOpenGLWidget)畫家類比
    1. 初始化OpenGL上下文

    QOpenGLWidget?構造函數自動創建OpenGL上下文

    initializeOpenGLFunctions()加載OpenGL函數,初始化Qt的OpenGL函數綁定

    畫家準備好畫布、工具箱(上下文=工具箱+畫布)。
    2. 定義頂點數據initializeGL()中定義數組(如float vertices[]畫家決定畫什么(如“畫一個三角形,左下紅、右下綠、頂部藍”)。
    3. 創建VBOglGenBuffers()?+?glBufferData()?在initializeGL()中完成把顏料擠到調色盤上(VBO=顏料管,存儲原始顏色和位置數據)。
    4. 創建VAOglGenVertexArrays()?+ 配置屬性(glVertexAttribPointer)在initializeGL()中完成

    調色盤(VAO)記錄:

    - 紅色顏料用于輪廓

    - 藍色顏料用于填充。

    5. 清空屏幕paintGL()中調用?glClear()畫家擦干凈畫布
    6. 綁定VAOpaintGL()中調用?glBindVertexArray(VAO)畫家拿起調色盤(綁定VAO后,OpenGL知道如何讀取VBO數據)。
    7. 繪制調用paintGL()中調用?glDrawArrays()畫家用調色盤上的顏料開始作畫
    8. 解綁VAO可調用?glBindVertexArray(0),但Qt通常省略畫家放下調色盤
    9.調整畫布大小重寫?resizeGL(int w, int h),自動調用畫家根據畫布大小調整畫筆范圍。

    10.清理資源

    QOpenGLWidget?析構函數自動釋放VAO/VBO畫家收工,清理調色盤和顏料。

    ?原生OpenGL對比Qt繪圖流程關鍵區別總結

    特性Qt (QOpenGLWidget)原生OpenGL (GLFW)
    上下文管理自動創建和管理OpenGL上下文需手動初始化(如GLFW/GLEW)
    窗口集成直接嵌入Qt窗口體系需手動處理窗口事件(如GLFW)
    函數調用通過?QOpenGLFunctions?調用OpenGL API直接調用OpenGL API(如?glDrawArrays
    生命周期自動調用?initializeGL()paintGL()需手動編寫渲染循環
    適用場景Qt應用程序中嵌入3D繪圖跨平臺游戲/獨立圖形應用

    Qt 的?QOpenGLWidget?繪圖完整代碼——制一個三色三角形

    1.1 創建自定義?QOpenGLWidget?子類
    // MyGLWidget.h
    #include <QOpenGLWidget>
    #include <QOpenGLFunctions>class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions {
    public:MyGLWidget(QWidget* parent = nullptr) : QOpenGLWidget(parent) {}protected:void initializeGL() override;  // 初始化OpenGLvoid paintGL() override;       // 繪制void resizeGL(int w, int h) override; // 窗口大小變化時調整private:GLuint VAO, VBO;  // OpenGL對象
    };
    1.2 實現?initializeGL(初始化階段)
    // MyGLWidget.cpp
    void MyGLWidget::initializeGL() {initializeOpenGLFunctions();  // 初始化Qt的OpenGL函數綁定// 定義頂點數據(位置 + 顏色)float vertices[] = {// 位置          // 顏色-0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f, // 左下(紅)0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f, // 右下(綠)0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f  // 頂部(藍)};// 創建并綁定VBOglGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 創建并綁定VAOglGenVertexArrays(1, &VAO);glBindVertexArray(VAO);// 配置位置屬性(前3個float)glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// 配置顏色屬性(后3個float,偏移量=3*sizeof(float))glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);// 解綁(非必須,但安全)glBindVertexArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);
    }
    1.3 實現?paintGL(渲染階段)
    void MyGLWidget::paintGL() {glClearColor(0.2f, 0.3f, 0.3f, 1.0f);  // 設置清屏顏色(深綠色)glClear(GL_COLOR_BUFFER_BIT);          // 清空顏色緩沖glBindVertexArray(VAO);                // 綁定VAO(自動關聯VBO和屬性)glDrawArrays(GL_TRIANGLES, 0, 3);      // 繪制三角形
    }
    1.4 實現?resizeGL(窗口調整)
    void MyGLWidget::resizeGL(int w, int h) {glViewport(0, 0, w, h);  // 調整視口大小
    }
    1.5 在Qt窗口中使用?MyGLWidget
    // main.cpp
    #include <QApplication>
    #include "MyGLWidget.h"int main(int argc, char** argv) {QApplication app(argc, argv);MyGLWidget widget;widget.show();return app.exec();
    }

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

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

    相關文章

    Qt::QueuedConnection詳解

    在多線程編程中&#xff0c;線程間的通信是一個關鍵問題。Qt框架提供了強大的信號和槽機制來處理線程通信&#xff0c;其中Qt::QueuedConnection是一種非常有用的連接類型。本文將深入探討Qt::QueuedConnection的原理、使用場景及注意事項。 一、基本概念 Qt::QueuedConnecti…

    X86 OpenHarmony5.1.0系統移植與安裝

    近期在研究X86鴻蒙,通過一段時間的研究終于成功了,在X86機器上成功啟動了openharmony系統了.下面做個總結和分享 1. 下載源碼 獲取OpenHarmony標準系統源碼 repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v5.1.0-Release --no-repo-ve…

    如何診斷服務器硬盤故障?出現硬盤故障如何處理比較好?

    當服務器硬盤出現故障時&#xff0c;及時診斷問題并采取正確的處理方法至關重要。硬盤故障可能導致數據丟失和系統不穩定&#xff0c;影響服務器的正常運行。以下是診斷服務器硬盤故障并處理的最佳實踐&#xff1a; 診斷服務器硬盤故障的步驟 1. 監控警報 硬盤監控工具&#…

    vue3提供的hook和通常的函數有什么區別

    Vue 3 提供的 hook&#xff08;組合式函數&#xff09; 和普通函數在使用場景、功能和設計目的上有明顯區別&#xff0c;它們是 Vue 3 組合式 API 的核心概念。下面從幾個關鍵維度分析它們的差異&#xff1a; 1. 設計目的不同 Hook&#xff08;組合式函數&#xff09; 專為 Vu…

    Spark提交流程

    bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn ./examples/jars/spark-examples_2.12-3.3.1.jar 10 這一句命令實際上是 啟動一個Java程序 java org.apache.spark.deploy.SparkSubmit 并將命令行參數解析到這個類的對應屬性上 因為master給…

    Microsoft Copilot Studio - 嘗試一下Agent

    1.簡單介紹 Microsoft Copilot Studio以前的名字是Power Virtual Agent(簡稱PVA)。Power Virutal Agent是2019年出現的&#xff0c;是低代碼平臺Power Platform的一部分。當時Generative AI還沒有出現&#xff0c;但是基于已有的Conversation AI技術&#xff0c;即Microsoft L…

    【源碼剖析】2-搭建kafka源碼環境

    在上篇文章kafka核心概念中&#xff0c;解釋了kafka的核心概念&#xff0c;下面開始進行kafka源碼編譯。為什么學習源碼需要進行源碼編譯呢&#xff0c;我認為主要有兩點&#xff1a; 可以進行debug&#xff0c;跟蹤代碼執行邏輯可以對源碼改動&#xff0c;強化學習學習效果 …

    小紅書視頻圖文提取:采集+CV的實戰手記

    項目說明&#xff1a;這波視頻&#xff0c;值不值得采&#xff1f; 你有沒有遇到過這樣的場景&#xff1f;老板說&#xff1a;“我們得看看最近小紅書上關于‘旅行’的視頻都說了些什么。”團隊做數據分析的&#xff0c;立馬傻眼&#xff1a;官網打不開、接口抓不著、視頻不能…

    Cloudflare 從 Nginx 到 Pingora:性能、效率與安全的全面升級

    在互聯網的快速發展中&#xff0c;高性能、高效率和高安全性的網絡服務成為了各大互聯網基礎設施提供商的核心追求。Cloudflare 作為全球領先的互聯網安全和基礎設施公司&#xff0c;近期做出了一個重大技術決策&#xff1a;棄用長期使用的 Nginx&#xff0c;轉而采用其內部開發…

    從編輯到安全設置: 如何滿足專業文檔PDF處理需求

    隨著數字化辦公的發展&#xff0c;PDF 已成為跨平臺文檔交互的標準格式。無論是在日常辦公、學術研究&#xff0c;還是項目協作中&#xff0c;對 PDF 文件進行高效編輯與管理的需求日益增長。功能全面、操作流暢且無額外負擔的 PDF 編輯工具&#xff0c;它是一款在功能上可與 A…

    Kafka消費者組位移重設指南

    #作者&#xff1a;張桐瑞 文章目錄 一、Kafka 與傳統消息引擎的核心差異二、重設消費者組位移的核心原因三、重設位移的兩大維度與七種策略四、重設位移的實現方式&#xff08;一&#xff09;Java API 方式&#xff08;二&#xff09;命令行腳本方式&#xff08;Kafka 0.11&am…

    分類模型:邏輯回歸

    1、針對設計&#xff1a;二分類 Logistic 回歸最初是為二分類問題設計的&#xff0c; Logistic 回歸基于概率&#xff0c;通過 Sigmoid 函數轉換輸入特征的線性組合&#xff0c;將任意實數映射到 [0, 1] 區間內。 通過引入一個決策規則&#xff08;通常是概率的閾值&#xff…

    CppCon 2015 學習:C++ WAT

    這段代碼展示了 C 中的一些有趣和令人困惑的特性&#xff0c;尤其是涉及數組訪問和某些語法的巧妙之處。讓我們逐個分析&#xff1a; 1. assert(map[“Hello world!”] e;) 這一行看起來很不尋常&#xff0c;因為 map 在這里被用作數組下標訪問器&#xff0c;但是在前面沒有…

    vscode自定義主題語法及流程

    vscode c/c 主題 DIY 啟用自己的主題(最后步驟) 重啟生效 文件–>首選項–>主題–>顏色主題: 也可以在插件里找到哈 手把手教你制作 在C:\Users\jlh.vscode\extensions下自己創建一個文件夾 里面有兩個文件和一個文件夾 具體內容: package.json: {"name&…

    前端傳遞日期范圍(開始時間和結束時間),后端解析及查詢

    前端技術&#xff1a;Vue3 TypeScript Element Plus 后端技術&#xff1a;Java Spring Boot MyBatis 應用效果&#xff1a; 原來方案 1、前端日期控件使用 el-date-picker&#xff0c;日期顯示格式和日期值返回格式都為&#xff1a;YYYY-MM-DD <el-form :model"…

    零基礎設計模式——行為型模式 - 命令模式

    第四部分&#xff1a;行為型模式 - 命令模式 (Command Pattern) 接下來&#xff0c;我們學習行為型模式中的命令模式。這個模式能將“請求”封裝成一個對象&#xff0c;從而讓你能夠參數化客戶端對象&#xff0c;將請求排隊或記錄請求日志&#xff0c;以及支持可撤銷的操作。 …

    禁止 Windows 更新后自動重啟

    Windows 默認會在安裝重要更新后自動重啟&#xff0c;但你可以調整設置來避免這種情況&#xff1a; ??方法 1&#xff1a;通過組策略&#xff08;適用于 Windows 專業版/企業版&#xff09;?? 按 Win R&#xff0c;輸入 gpedit.msc 打開 ??本地組策略編輯器??。導航…

    GoldenDB簡述

    GoldenDB是國產的分布式數據庫。它徹底解決了事務一致性&#xff0c;數據實時一致性的問題。采用的是Shared Nothing&#xff08;分片式存儲&#xff09;的分布式架構。就是不共享數據&#xff0c;各自節點持有各自的數據。對比不共享的&#xff0c;還有其他兩種分布式架構&…

    訓練過程中的 Loss ?

    文章目錄 在我們訓練的過程中&#xff0c;設置好這個epochs也就是訓練的輪次&#xff0c;然后計算這個損失函數&#xff0c;我們可以知道這個具體的訓練的情況&#xff0c;那么在訓練的過程中&#xff0c;這個損失函數的變化有哪些情況&#xff1f;對應的一個解釋情況是怎么樣的…

    S2B2B農產品供應鏈交易多平臺開發有哪些發展前景?如何維護?

    一、S2B2B農產品供應鏈交易多平臺開發的未來發展前景 本文將由小編為您介紹關于S2B2B農產品供應鏈交易多平臺開發的內容&#xff0c;希望能夠幫助大家。在數字化時代&#xff0c;農產品供應鏈的數字化轉型成為了一種必然趨勢。S2B2B(Supplier to Business to Business)模式通過…