OpenGL ES 基本基本使用、繪制基本2D圖形

OpenGL ES 繪制基礎圖形

OpenGL ES基本概念

OpenGL ES (Embedded-System) 是專為嵌入式設備(如手機、平板、VR 設備)設計的圖形 API,是 OpenGL 的輕量級版本。

|下面是一個Android使用 OpenGL ES的基本框架

  • MainActivity 設置一個 GLSurfaceView 直接顯示

class MainActivity : ComponentActivity() {private lateinit var glSurfaceView: GLSurfaceViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)glSurfaceView = GLSurfaceView(this)// 設置渲染器glSurfaceView.setRenderer(GLRender())setContentView(glSurfaceView)}override fun onResume() {super.onResume()glSurfaceView.onResume()}override fun onPause() {super.onPause()glSurfaceView.onPause()}
}
  • GLRender 著色器代碼已經其內部函數含義,由于沒有繪制樣式,運行后顯示黑色屏幕,因為onSurfaceCreated時將顏色重制為黑色。

class GLRender : Renderer {/*** 應用程序窗口創建時調用的函數* 一般處理一些全局的設置*/override fun onSurfaceCreated(gl: GL10, config: EGLConfig?) {// 設置需要對透視進行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST)// 設置清理屏幕顏色 RGBA 取值范圍為 0-1之間的float數 0 0 0 就是黑色gl.glClearColor(0F, 0F, 0F, 1F)// 啟動深度緩存 如果不啟動深度緩存效果,后繪制的東西可能會覆蓋先繪制的東西。// 啟動深度緩存后,按照實際Z值來處理遠近效果,更符合3D效果。gl.glEnable(GL10.GL_DEPTH_TEST)}/*** 應用程序窗口改變時調用的函數*/override fun onSurfaceChanged(gl: GL10, width: Int, height: Int) {val ratio: Float = width / height.toFloat()// 設置GL場景的大小gl.glViewport(0, 0, width, height)// 設置投影矩陣為投影矩陣// 定義視錐體(View Frustum)和投影方式(透視或正交),決定物體如何從 3D 空間投影到 2D 屏幕上。// 其他矩陣類型還有模型矩陣,紋理矩陣等gl.glMatrixMode(GL10.GL_PROJECTION)// 重制投影矩陣// 作用是將當前矩陣重置為單位矩陣(Identity Matrix)。// 若不調用該函數,矩陣會保留之前的變換狀態,可能導致后續變換疊加在已有變換上,產生非預期的結果gl.glLoadIdentity()// 創建一個透視投影矩陣,設置窗口大小gl.glFrustumf(-ratio, ratio, -1F, 1F, 1F, 10F)}/*** Android在圖形繪制時調用的方法,除非設置手動刷新,否則會一直調用。*/override fun onDrawFrame(gl: GL10) {// 清理緩存 顏色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 設置模型視圖矩陣gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩陣gl.glLoadIdentity()// 視角變換,就是觀察的方向,眼睛的位置,中心點的位置 和 視線的朝向GLU.gluLookAt(gl,0F,0F,3F,0F,0F,0F,0F,1F,0F)}
}

通過 OpenGL ES 完成 2D圖形的繪制。

  • OpenGL的坐標向線如下:
    openGL 坐標

繪制三角形

private val one: Int = 0x10000// 正確創建直接緩沖區private val triggerBuffer: IntBuffer by lazy {// 創建直接緩沖區并設置本地字節序val byteBuffer = ByteBuffer.allocateDirect(3 * 3 * 4) // 3個頂點,每個3個分量,每個int占4字節byteBuffer.order(ByteOrder.nativeOrder())// 獲取 IntBuffer 視圖val intBuffer = byteBuffer.asIntBuffer()// 填充頂點數據intBuffer.put(intArrayOf(0, one, 0,        // 頂點1-one, -one, 0,    // 頂點2one, -one, 0      // 頂點3))// 重置位置到起始點intBuffer.position(0)intBuffer}
override fun onDrawFrame(gl: GL10) {// 清理緩存 顏色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 設置模型視圖矩陣gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩陣gl.glLoadIdentity()// 視角變換,就是觀察的方向,眼睛的位置,中心點的位置 和 視線的朝向GLU.gluLookAt(gl, 0F, 0F, 3F, 0F, 0F, 0F, 0F, 1F, 0F)// 允許設置頂點gl.glEnableClientState(GL10.GL_VERTEX_ARRAY)// 給三角形設置頂點數組// size 含義代表每個點有 xyz三個方向數據所以size為3;// GL10.GL_FIXED 為整形數據 還可以設置 GL_FLOAT 浮點型,以及其他類型,甚至是無符號類型// 第三個參數代表相鄰頂點之間的偏移量,0 表示緊密排列。即下一個頂點數據緊跟當前頂點數據。非0的話代表交替存儲頂點數據額外便宜的字節。gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer)// 繪制三角形 GL_TRIANGLES 代表三角形,開始0 繪制3個點。gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3)// 關閉頂點設置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY)}

上述代碼繪制了一個三角形如下:
在這里插入圖片描述

需要注意的是創建三角形頂點使用的buffer必須使用直接緩沖區,提高數據讀取的速度。

  • 繪制正方形 , 三角形右側增加繪制正方形。
// 創建正方形直接緩沖區private val squareBuffer: IntBuffer by lazy {// 創建直接緩沖區并設置本地字節序val byteBuffer = ByteBuffer.allocateDirect(4 * 3 * 4) // 4個頂點,每個3個分量,每個int占4字節byteBuffer.order(ByteOrder.nativeOrder())// 獲取 IntBuffer 視圖val intBuffer = byteBuffer.asIntBuffer()// 填充頂點數據intBuffer.put(intArrayOf(one, one, 0,        // 頂點1-one, one, 0,    // 頂點2one, -one, 0,      // 頂點3-one, -one, 0      // 頂點4))// 重置位置到起始點intBuffer.position(0)intBuffer}/*** Android在圖形繪制時調用的方法,除非設置手動刷新,否則會一直調用。*/override fun onDrawFrame(gl: GL10) {// 清理緩存 顏色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 設置模型視圖矩陣gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩陣gl.glLoadIdentity()// 視角變換,就是觀察的方向,眼睛的位置,中心點的位置 和 視線的朝向GLU.gluLookAt(gl, 0F, 0F, 3F, 0F, 0F, 0F, 0F, 1F, 0F)// 設置模型位置gl.glTranslatef(-2.0F, 0.0F, -4.0F)// 允許設置頂點gl.glEnableClientState(GL10.GL_VERTEX_ARRAY)// 給三角形設置頂點數組// size 含義代表每個點有 xyz三個方向數據所以size為3;// GL10.GL_FIXED 為整形數據 還可以設置 GL_FLOAT 浮點型,以及其他類型,甚至是無符號類型// 第三個參數代表相鄰頂點之間的偏移量,0 表示緊密排列。即下一個頂點數據緊跟當前頂點數據。非0的話代表交替存儲頂點數據額外便宜的字節。gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer)// 繪制三角形 GL_TRIANGLES 代表三角形,開始0 繪制3個點。gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3)// 重制模型矩陣gl.glLoadIdentity()// 繪制正方形  兩個相同的三角形組成正方形,可以采用三角形的帶// 設置模型位置  為了顯示效果更小所以 Z 周弄遠了。Z越大看起來離我們越近顯示效果越大(也可以通過坐標修改)gl.glTranslatef(1F, 0.0F, -6.0F)// 設置頂點數據gl.glVertexPointer(3, GL10.GL_FIXED, 0, squareBuffer)// 繪制正方形gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4)// 關閉頂點設置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY)}

繪制三角形以后,重制模型矩陣gl.glLoadIdentity() ,設置模型位置 gl.glTranslatef,設置頂點數據gl.glVertexPointer,繪制正方形。gl.glDrawArrays。

效果如下
在這里插入圖片描述

在0penGL中繪制2D多邊形常用的函數以及常量:

  • glEnableClientState/glDisableClientState:狀態開關
  • glVertexPointer:設置頂點數據
  • glDrawArrays:繪制函數
  • GL_VERTEX_ARRAY:頂點數組
  • GL_BYTE/GL_SHORT/GL_FIXED/GL_FLOAT:頂點數據的類理
  • GL_LINES:線
  • GL_TRIANGLES:三角形
  • GL_TRIANGLE_STRIP:三角形帶

如何繪制顏色

// 創建顏色buffer 分為 RGBA private val colorBuffer: IntBuffer by lazy {// 創建直接緩沖區并設置本地字節序val byteBuffer = ByteBuffer.allocateDirect(3 * 4 * 4)byteBuffer.order(ByteOrder.nativeOrder())// 獲取 IntBuffer 視圖val intBuffer = byteBuffer.asIntBuffer()// 填充頂點數據intBuffer.put(intArrayOf(one, 0, 0, one,         // 頂點10, one, 0, one,   // 頂點20, 0, one, one      // 頂點3))// 重置位置到起始點intBuffer.position(0)intBuffer}override fun onDrawFrame(gl: GL10) {// 清理緩存 顏色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 設置模型視圖矩陣gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩陣gl.glLoadIdentity()// 視角變換,就是觀察的方向,眼睛的位置,中心點的位置 和 視線的朝向GLU.gluLookAt(gl, 0F, 0F, 3F, 0F, 0F, 0F, 0F, 1F, 0F)// 設置模型位置gl.glTranslatef(-2.0F, 0.0F, -4.0F)// 允許設置頂點gl.glEnableClientState(GL10.GL_VERTEX_ARRAY)// 允許設置顏色數組gl.glEnableClientState(GL10.GL_COLOR_ARRAY)gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer)// 給三角形設置頂點數組// size 含義代表每個點有 xyz三個方向數據所以size為3;// GL10.GL_FIXED 為整形數據 還可以設置 GL_FLOAT 浮點型,以及其他類型,甚至是無符號類型// 第三個參數代表相鄰頂點之間的偏移量,0 表示緊密排列。即下一個頂點數據緊跟當前頂點數據。非0的話代表交替存儲頂點數據額外便宜的字節。gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer)// 繪制三角形 GL_TRIANGLES 代表三角形,開始0 繪制3個點。gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3)// 繪制完成禁用顏色數組繪制gl.glDisableClientState(GL10.GL_COLOR_ARRAY)// 重制模型矩陣gl.glLoadIdentity()// 繪制正方形  兩個相同的三角形組成正方形,可以采用三角形的帶// 設置模型位置  為了顯示效果更小所以 Z 周弄遠了。Z越大看起來離我們越近顯示效果越大gl.glTranslatef(1F, 0.0F, -6.0F)// 設置頂點數據gl.glVertexPointer(3, GL10.GL_FIXED, 0, squareBuffer)// 設置顏色,R G B A 的色值gl.glColor4f(1F, 0F, 0F, 1F)// 繪制正方形gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4)// 關閉頂點設置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY)}

// 設置顏色,R G B A 的色值
gl.glColor4f(1F, 0F, 0F, 1F) 這里只給紅色和透明度設置成1 顯示效果為紅色
給正方形上色,直接采用設置RGBA的方式,單一的顏色

gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer) 給三角形繪制平滑過渡的顏色,需要開啟設置顏色數組,使用結束后關閉。

效果如下:
在這里插入圖片描述

  • 顏色所需要的常用函數
常用函數及常量
- glColor4f:設置單一顏色
- glColorPointer:設置顏色數組
- GL_COLOR_ARRAY:顏色數組(通過狀態開關函數
- glDisableClientState 來操作)
- GL_COLOR_BUFFER_BIT:顏色緩存

圖形的變換

OpenGLES有三種不同類型的變換,它們分別是:轉移(Translate):在3D空間中移動物體旋轉(Rotate):繞X,Y,或者 Z 軸進行旋轉縮放(Scale):改變物體的大小
  • 為了防止上述三角形和正方形的位置重疊,進行了 gl.glTranslatef(1F, 0.0F, -6.0F) 這就是平移操作。

gl.glTranslatef(1F, 0.0F, -6.0F) 代表分別在 x y z上分別平移多少距離。

  • 旋轉操作
 /*** 定義旋轉角度*/var rotate1: Float = 0Fvar rotate2: Float = 0F/*** Android在圖形繪制時調用的方法,除非設置手動刷新,否則會一直調用。*/override fun onDrawFrame(gl: GL10) {// 清理緩存 顏色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 設置模型視圖矩陣gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩陣gl.glLoadIdentity()// 視角變換,就是觀察的方向,眼睛的位置,中心點的位置 和 視線的朝向GLU.gluLookAt(gl, 0F, 0F, 3F, 0F, 0F, 0F, 0F, 1F, 0F)// 設置模型位置gl.glTranslatef(-2.0F, 0.0F, -4.0F)// 設置旋轉角度 設置成了繞Y軸旋轉gl.glRotatef(rotate1, 0F, 1F, 0F)// 允許設置頂點gl.glEnableClientState(GL10.GL_VERTEX_ARRAY)// 允許設置顏色數組gl.glEnableClientState(GL10.GL_COLOR_ARRAY)gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer)// 給三角形設置頂點數組// size 含義代表每個點有 xyz三個方向數據所以size為3;// GL10.GL_FIXED 為整形數據 還可以設置 GL_FLOAT 浮點型,以及其他類型,甚至是無符號類型// 第三個參數代表相鄰頂點之間的偏移量,0 表示緊密排列。即下一個頂點數據緊跟當前頂點數據。非0的話代表交替存儲頂點數據額外便宜的字節。gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer)// 繪制三角形 GL_TRIANGLES 代表三角形,開始0 繪制3個點。gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3)// 繪制完成禁用顏色數組繪制gl.glDisableClientState(GL10.GL_COLOR_ARRAY)// 重制模型矩陣gl.glLoadIdentity()// 繪制正方形  兩個相同的三角形組成正方形,可以采用三角形的帶// 設置模型位置  為了顯示效果更小所以 Z 周弄遠了。Z越大看起來離我們越近顯示效果越大gl.glTranslatef(1F, 0.0F, -6.0F)// 設置繞X軸旋轉gl.glRotatef(rotate2, 1F, 0F, 0F)// 設置頂點數據gl.glVertexPointer(3, GL10.GL_FIXED, 0, squareBuffer)// 設置顏色,R G B A 的色值gl.glColor4f(1F, 0F, 0F, 1F)// 繪制正方形gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4)// 關閉頂點設置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY)// 改變旋轉角度rotate1 += 0.5Frotate2 += 0.5F}

在這里插入圖片描述

上端代碼實際上增加了 gl.glRotatef(rotate2, 1F, 0F, 0F) ,參數依次是 角度,x軸 y軸 z軸旋轉。看上圖效果實際上是動旋轉,三角Y軸旋轉,正方形一直繞x軸旋轉。然后通過改變第一個參數的角度,一直旋轉。

  • 放大
// 增加如下代碼即可 x y z 放大2倍 
gl.glScalef(2.0F,2.0F,2.0F)

在這里插入圖片描述

總結

2D基本圖形的繪制;坐標系;著色方式包括單一著色,平滑著色;圖形的平移、旋轉、縮放。

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

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

相關文章

JavaScript進階(十二)

第三部分:JavaScript進階 目錄 第三部分:JavaScript進階 十二、深淺拷貝 12.1 淺拷貝 12.2 深拷貝 1. 通過遞歸實現深拷貝 2. js庫lodash里面cloneDeep內部實現了深拷貝 3. 通過JSON.stringify()實現 十三、異常處理 13.1 throw拋異常 13.2 try /catch捕獲異常 1…

大疆制圖跑飛馬D2000的正射與三維模型

1 問題描述 大疆制圖在跑大疆無人機飛的影像的時候,能夠自動識別相機參數并且影像自帶pos信息,但是用飛馬無人機獲取的影像pos信息與影像是分開的(飛馬無人機數據處理有講),所以在用大疆制圖時需要對相機參數進行設置…

探索服務網格(Service Mesh):云原生時代的網絡新范式

文章目錄 一、引言二、什么是服務網格基本定義形象比喻 三、服務網格解決了哪些問題微服務通信復雜性可觀察性安全性 四、常見的服務網格實現IstioLinkerdConsul Connect 五、服務網格的應用場景大型微服務架構混合云環境 六、服務網格的未來發展與其他技術的融合標準化和行業規…

Electron+vite+vue3 從0到1搭建項目,開發Win、Mac客戶端

隨著前端技術的發展,出現了所謂的大前端。 大前端則是指基于前端技術延伸出來的各種終端平臺及應用場景,包括APP、桌面端、手表終端、服務端等。 本篇文章主要是和大家一起學習一下使用Electron 如何打包出 Windows 和 Mac 所使用的客戶端APP&#xff…

【DevSecOps】從零到一:用OpenAI Codey與Trivy打造智能化安全掃描 CI/CD 流水線實戰

背景與動機 核心概念:DevSecOps、OpenAI Codey 與 Trivy 什么是 DevSecOpsOpenAI Codey(Codex)概覽Trivy 掃描器簡介 架構設計與技術選型 流水線實戰:GitHub Actions 集成示例 多平臺適配:GitLab CI 與 Azure DevO…

Swagger、Springfox、Springdoc-openapi 到底是什么關系

記得剛開始想在 SpringBoot 應用中使用 Swagger 生成 API 文檔時,在 Swagger 官網上想找如何在 SpringBoot 中使用的指導,結果肯定是找不到,因為當時不清楚 Swagger 的定位是什么,只知道可以用它生成 API 文檔。所以就想寫這篇文章…

目標檢測DINO-DETR(2023)詳細解讀

文章目錄 對比去噪訓練混合查詢選擇look forward twice 論文全稱為:DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 提出了三個新的方法: 首先,為了改進一對一的匹配效果,提出了一種對比去噪訓練方法…

深度學習-162-DeepSeek之調用遠程大模型API接口參數結構分析

文章目錄 1 文本對話請求1.1 請求參數1.1.1 參數說明1.1.2 參數總結1.2 返回參數1.2.1 id1.2.2 choices1.2.3 usage1.2.4 created1.2.5 model1.2.6 object1.2.7 參數總結2 應用示例2.1 調用大模型API2.2 返回結果3 參考附錄分析文本對話請求v1/chat/completions的參數結構含義。…

uniapp原生插件

前言 使用uniapp開發Android app時,一些特定的需求沒辦法實現的時候就只能開發原生插件或者uts插件去滿足需求,我的需求目前uts插件沒法實現,只能靠原生插件了😆 需求:拍照不保存圖片到相冊,uniapp的API或…

CVE-2024-42323

漏洞名稱 Apache HertzBeat SnakeYaml 反序列化遠程代碼執行漏洞(CVE-2024-42323) 漏洞描述 Apache HertzBeat 是一款開源的實時監控告警工具,支持對操作系統、中間件、數據庫等多種對象進行監控,并提供 Web 界面進行管理。 在…

“人工智能+多學科”選題思路,2025熱點AI+(180個)

給大家整理了一份超全的論文資料合集 不僅有論文創新點的干貨知識、開題報告模板、文獻綜述模板、審稿意見回復模板、還有全套的SCI論文寫作指導教程和人工智能各方向經典的論文合集以及各大熱門科研和論文寫作潤色工具等 以及1000G人工智能資料包(如下圖&#xff…

LangChain4j入門AI(八)使用RAG增加私有知識庫

前言 我們通過提示詞工程提升了通用LLM的專業知識水平,并結合Function Calling構建了私有業務能力。為了在實際應用中有效維護私有領域的專有數據,我們進一步采用大模型微調或RAG檢索增強技術,使LLM能夠充分掌握私有知識庫的內容。 一、微調…

使用arXiv.org上的資源進行學術研究

arXiv.org e-Print archive arXiv.org 是一個收集物理學、數學、計算機科學、定量生物學、定量金融學和統計學等領域學術論文預印本的網站,其使命是促進科學文獻的傳播與交流。以下是關于該網站的詳細介紹: 核心定位與功能 學術預印本平臺&#xff1a…

Redis 中的緩存擊穿、緩存穿透和緩存雪崩是什么?

在 Redis 中,緩存擊穿、緩存穿透和緩存雪崩是常見的緩存問題,它們都會影響系統的性能和穩定性。以下是針對這三個問題的詳細解釋: 一、緩存擊穿(Cache Breakdown) 定義:緩存擊穿是指某個熱點數據在緩存中…

RabbitMQ配置環境變量

一、RabbitMQ下載 1、從官網下載 在官網中下載,適合自己電腦的版本。我直接下載的windows版本。 然后下載opt這個軟件這個版本適合3.6.3的RabbitMQ,點擊藍色的字體即可下載。 2、安裝erlang 當你雙擊安裝程序并進入安裝向導后,會看到這樣…

基于vue框架的東莞市二手相機交易管理系統5yz0u(程序+源碼+數據庫+調試部署+開發環境)帶論文文檔1萬字以上,文末可獲取,系統界面在最后面。

系統程序文件列表 項目功能:用戶,相機分類,二手相機 開題報告內容 基于FlaskVue框架的東莞市二手相機交易管理系統開題報告 一、研究背景與意義 1.1 研究背景 隨著數字技術的迅猛發展和攝影文化的廣泛普及,相機已成為人們記錄生活、表達創意的重要工…

dify調用Streamable HTTP MCP應用

一、概述 上一篇文章,介紹了使用python開發Streamable HTTP MCP應用,鏈接:https://www.cnblogs.com/xiao987334176/p/18872195 接下來介紹dify如何調用MCP 二、插件 安裝插件 需要安裝2個插件,分別是:Agent 策略(支持 …

筆記:將一個文件服務器上的文件(一個返回文件數據的url)作為另一個http接口的請求參數

筆記:將一個文件服務器上的文件(一個返回文件數據的url)作為另一個http接口的請求參數 最近有這么個需求,需要往某一個業務的外部接口上傳文件信息,但是現在沒有現成的文件,只在數據庫存了對應的url&#…

如何在 FastAPI 中合理使用 Pydantic 的 Alias

下面的內容是我跟 Gemini 2.5 Pro 探討關于Pydantic 的 Alias 問題之后,讓它總結的一篇技術博客。 我已經有很長一段時間沒有好好寫技術類的博客了,這就是原因。 可以在 https://panzhixiang.cn/ 查看更多我的博客,有技術的,也有很…

CAU人工智能class4 批次歸一化

歸一化 在對輸入數據進行預處理時會用到歸一化,將輸入數據的范圍收縮到0到1之間,這有利于避免綱量對模型訓練產生的影響。 但當模型過深時會產生下述問題: 當一個學習系統的輸入分布發生變化時,這種現象稱之為“內部協變量偏移”…