3.8[a]cv

函數核心目標

實現屏幕空間內三角形的光柵化,將三角形覆蓋的像素點顏色填充到幀緩沖區,同時處理深度測試(Z-Buffer)。這是渲染管線中幾何階段到像素階段的關鍵步驟

包圍盒計算(Bounding Box)?**
  • ?功能:確定三角形在屏幕空間的最小包圍區域,減少無效像素遍歷。
  • ?實現邏輯
    • 遍歷三角形的三個頂點,取最小和最大的x、y坐標值,形成矩形包圍盒。

?遍歷包圍盒內像素**
  • ?功能:對包圍盒內的每個像素進行“是否在三角形內”的測試。
  • ?實現邏輯
    • 對每個像素點(x, y),調用insideTriangle函數判斷其是否在三角形內部

若在三角形內,則進行深度插值和顏色填充

點是否在三角形內的判斷**
  • ?算法:通過叉乘符號一致性測試(Cross Product Sign Test)

(4) 重心坐標與深度插值**
  • ?功能:通過重心坐標插值計算當前像素的深度值(Z值),用于深度測試

?深度測試與顏色填充**
  • ?深度測試:比較當前像素的插值深度與深度緩沖區的值。若更小(更近),則更新深度緩沖區并填充顏色。
  • ?顏色設置:使用三角形顏色插值(作業2)或紋理采樣(作業3)
    ,調用set_pixel函數寫入幀緩沖區。

?關鍵函數調用鏈

  1. ?**draw()**:處理模型-視圖-投影變換(MVP),將頂點轉換到屏幕空間。
  2. ?**rasterize_triangle()**:執行光柵化邏輯。
  3. ?**set_pixel()**:將最終顏色寫入幀緩沖區的指定位置。

注意事項

  • ?性能優化:包圍盒可結合整數坐標計算,減少浮點運算誤差。
  • ?抗鋸齒:作業2為基礎實現,實際渲染中可能需要超采樣(MSAA)處理鋸齒問題。

該函數用于在離散像素網格中繪制一條顏色為白色(RGB 255,255,255)的直線,基于經典的Bresenham直線算法

其核心邏輯是通過整數運算逐像素逼近理想直線,避免浮點運算以提高效率。算法根據斜率大小分為兩種處理模式:

  1. ?當斜率絕對值≤1?(水平方向變化更大)時,以x軸為主步進方向。
  2. ?當斜率絕對值>1?(垂直方向變化更大)時,以y軸為主步進方向

t?是什么?

  • ?**t?是三角形對象**:在光柵化器中,t?是?Triangle?類的實例,表示一個需要被繪制的三角形。這個類通常包含以下信息:

    • 三個頂點的位置(v[0],?v[1],?v[2]
    • 頂點顏色、紋理坐標等屬性(取決于具體實現)
  • ?來源:在?rasterize_triangle(const Triangle& t)?函數中,t?是函數的參數,表示當前正在處理的三角形。

t.v[0]t.v[1]t.v[2]?是什么?

  • ?頂點數組t.v?是存儲三角形三個頂點的數組,每個頂點是一個 ?三維向量?(例如?Eigen::Vector3f),包含以下信息:

    • ?x():頂點的 x 坐標(屏幕空間或投影空間)
    • ?y():頂點的 y 坐標
    • ?z():頂點的深度值(用于深度緩沖)

  1. ?**pos_buffer(頂點位置緩沖區)?**

    • 類型:rst::pos_buf_id
    • 作用:存儲三角形頂點的模型空間坐標。通過pos_buffer.pos_id從全局位置緩沖區中獲取頂點數據,每個頂點為三維坐標(如Eigen::Vector3f)。
  2. ?**ind_buffer(索引緩沖區)?**

    • 類型:rst::ind_buf_id
    • 作用:定義頂點如何組合成三角形。通過ind_buffer.ind_id獲取索引數組,每組3個索引對應一個三角形的三個頂點(如i[0],?i[1],?i[2])。
  3. ?**type(圖元類型)?**

    • 類型:rst::Primitive
    • 作用:指定渲染的圖元類型。當前代碼僅支持Triangle類型,其他類型會拋出異常。這是為了適配圖形管線中三角形光柵化的特定需求

auto v = t.toVector4();?這一操作的作用是將三角形頂點從三維坐標轉換為四維齊次坐標,其核心目的是為了支持透視投影下的正確深度插值透視校正屬性插值

在圖形管線中,頂點經過MVP矩陣變換后會處于齊次裁剪空間?(Homogeneous Clip Space),此時坐標是四維的(x, y, z, w)。通過調用?t.toVector4()?可以獲取頂點在齊次空間中的完整信息

深度插值
  • ?問題背景
    在透視投影中,物體“近大遠小”的特性導致屏幕空間的均勻步長對應視圖空間中的非線性步長。若直接對屏幕空間坐標線性插值,視圖空間的深度值(z)會失真

傳統的GPU渲染流水線(管線)是基于光柵化的一套流程,之所以要強調傳統,是為了將之區別于基于光線追蹤(ray trace)的流水線和基于體素化的流水線。在光柵管線中,最基本的2個著色器是頂點著色器和像素著色器,在下圖中,除了2個著色器可編程,中間三個時鐘節點都是固定的,只能配置不可編程。

新的形狀保持了一些特性:平行線仍然是平行的,各處密度均勻,原點不變。如果原點位置變化的話那就得加上平移,線性矩陣變成仿射矩陣

那什么是線性插值呢?即均勻地插值,比如線段的中點的插值一定是兩端之和處以2,這個例子是一維的插值,多維也是類似。下圖中列舉了頂點色和頂點法線的線性插值

關于“密度”可以這樣理解:在原始三角形上均勻的撒一些散點,待它被投影到屏幕三角形上之后,這些點是否仍然分布均勻?想象一下,很顯然在正交投影的情況下,是均勻的,但透視投影中,距離相機近的部位散點更稀疏,遠處的散點更密集。

所以我們要找到插值和插值點之間真正的函數關系,所以我引入了下面的視錐側剖圖:其中O點是攝像機,L是近截面,ax+bz=c是三角形。我們抽象一個虛擬的插值點t,范圍是0~1,t從(P1,-e)出發,勻速運動至(p2,-e),t的值也勻速地從0增長至1。圖中可以看出,近截面上的均勻散點反投影到三角形上時變得不均勻了,此外還能得出,插值點的x坐標P與t線性相關。

仿射矩陣是線性變換與平移變換的結合形式,其核心作用是將原本分離的線性操作(如旋轉、縮放)和平移操作統一在一個矩陣框架下處理

FOV(視場角)的定義

FOV(Field of View)?,即視場角,用于描述光學設備(如攝像頭、鏡頭、人眼等)能夠捕捉到的最大可見范圍,通常以角度(°)為單位.其本質是一個幾何概念,類似于人眼的視野范圍,但受設備硬件(如傳感器尺寸、焦距)和光學設計的限制

  • 未校正的插值
    假設一個長條形紋理貼在一個傾斜的平面上,若直接線性插值,近處的紋理會被壓縮,遠處的會被拉伸,導致紋理扭曲(如棋盤格變成梯形)。

  • ?校正后的效果
    通過透視校正,紋理在視圖空間中保持均勻分布,屏幕空間中的非線性變化被抵消,紋理顯示正確(如棋盤格保持正方形)

此階段通過透視投影矩陣將頂點從視圖坐標空間?(觀察坐標系)變換到裁剪空間?(Clip Space)。該矩陣的作用包括:

  • ?近大遠小:模擬人眼的視覺特征,使遠處物體縮小,近處物體放大。
  • ?視錐體壓縮:將視圖空間中的視錐體(由近/遠裁剪平面和視角定義的棱臺)映射到規則觀察體(Canonical View Volume),即邊長為2的立方體(范圍[-1,1])。
  • ?深度非線性處理:通過矩陣運算將視圖空間的Z值轉換為裁剪空間的W分量,為后續透視除法做準備

透視除法(齊次除法)?
裁剪空間的頂點坐標需進行齊次除法?(即各分量除以W分量),得到歸一化設備坐標(NDC)?

  • ?公式(Xndc, Yndc, Zndc) = (Xclip/Wclip, Yclip/Wclip, Zclip/Wclip)
  • ?深度非線性:NDC的Z軸范圍[-1,1],但視圖空間的Z值與NDC的Z值呈非線性關系,

  1. 模型空間 → 視圖空間:通過視圖矩陣(View Matrix)轉換,處理攝像機位置與朝向。
  2. ?視圖空間 → 裁剪空間:應用透視投影矩陣,完成視錐體壓縮。
  3. ?裁剪空間 → NDC空間:齊次除法實現非線性映射。
  4. ?NDC空間 → 屏幕空間:視口變換適配顯示設備。

三角形有很多特性,非常適合作為渲染的最小單位,如:

  • 各頂點/各邊在同一平面上

  • 內部的點很好定義

  • 三角形內的頂點之間插值容易實現(質心插值)

齊次坐標通過引入第四維 ?w,,w不是一個值,而是一個維度,如x,y,z的表示一樣

支持透視投影與深度感知
在透視投影中,?w 分量存儲深度信息(如相機到物體的距離)?。通過投影矩陣修改 ?w?的值(例如?w_clip = -z_eye),后續透視除法(x/w, y/w, z/w)能實現“近大遠小”的視覺效果

例如,遠處的物體因 ?w 值較大,其投影后的坐標會被壓縮,符合人眼透視規律

?

頂點之間的插值指通過三角形三個頂點的已知屬性(如顏色、紋理坐標、法線等),利用數學方法(如重心坐標)計算三角形內部任意點的屬性值的過程

例如,已知頂點顏色為紅、綠、藍,插值后三角形內部會呈現平滑的漸變混合效果

為什么需要插值?

  1. ?屬性傳遞需求
    三角形頂點僅存儲少量屬性(如位置、法線),但渲染時需要為每個內部像素(或片元)賦予屬性值。插值通過頂點數據的加權混合,將離散頂點屬性擴散到整個三角形表面

示例:?若頂點存儲紋理坐標,內部像素的紋理坐標需通過插值計算,才能正確映射貼圖

幾何連續性的保證
三角形是平面多邊形中最簡單的形式,其線性插值特性(如重心坐標的非負性和歸一化)能保證屬性在三角形內部平滑過渡,避免突變

?

  • +1.0將NDC坐標范圍從[-1,1]映射到[0,2]
  • 0.5*width將坐標縮放到屏幕實際像素尺寸,例如width=800時,x=1.0會被映射到800像素位置

  • 將NDC的z值[-1,1]映射到深度緩沖區范圍[0.1,50]
  • 線性變換公式:zbuffer?=(zndc?×24.95)+25.05,確保深度值適配渲染管線的深度測試范圍

head<3>的含義

  • ?語法作用head<3>是Eigen庫的向量操作方法,表示取前3個分量
  • ?數值意義:當應用于Eigen::Vector4f(四維向量)時,vec.head<3>()會返回一個三維向量(Eigen::Vector3f
  • ?應用場景
    • 頂點坐標v[i]經過MVP變換和視口變換后是四維向量(x, y, z, w)
    • 但三角形頂點只需要三維坐標(x, y, z),因此需要截取前三個分量

?

投影矩陣的約定
代碼中f1=(50-0.1)/2.0f2=(50+0.1)/2.0的推導源于投影矩陣的參數設置。這里的50和0.1分別對應視錐體的遠(far plane)和近(near plane)平面距離,映射公式z' = z*f1 + f2實際是線性變換:
zbuffer?=2zndc?+1??(far?near)+near
將NDC的[-1,1]線性映射到[near, far]的實際深度范圍

在齊次除法中,除以vec.w()是因為經過模型-視圖-投影(MVP)矩陣變換后,頂點的齊次坐標的w分量可能不再為1,尤其是當使用透視投影時。以下是關鍵點解析:

  1. ?投影矩陣的作用

    • ?透視投影矩陣會修改頂點的w分量,通常將其設置為頂點的原始z值(或相關值)。例如,OpenGL的透視投影矩陣會將頂點變換到裁剪空間,此時w分量變為-z
    • 例如,應用如下投影矩陣后的頂點齊次坐標為:
      (a*x, b*y, c*z + d, -z),此時w = -z而非1。
  2. ?齊次除法的必要性

    • 齊次除法(vec /= vec.w())將裁剪空間坐標轉換為歸一化設備坐標(NDC)?,范圍為[-1, 1]3
    • 此步驟通過除以w實現透視校正,使遠處的物體看起來更小(透視效果)。
  3. ?代碼流程分析

    • ?**mvp * to_vec4(buf[i[...]], 1.0f)**:頂點初始化為(x, y, z, 1),但經過投影矩陣后w被改變。
    • ?除以vec.w():確保正確投影到NDC,無論w是否被修改(如透視投影時)。
  4. ?正交投影的特殊情況

    • 若使用正交投影,投影矩陣通常保持w = 1,此時齊次除法無實際影響,但仍需統一處理。

總結:即使頂點初始w為1,投影矩陣會修改w,因此必須進行齊次除法才能正確投影到屏幕空間。這是實現透視效果的關鍵步驟。

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

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

相關文章

導入 Excel 規則批量修改或刪除 Excel 表格內容

我們前面介紹過按照規則批量修改 Excel 文檔內容的操作&#xff0c;可以對大量的 Excel 文檔按照一定的規則進行統一的修改&#xff0c;可以很好的解決我們批量修改 Excel 文檔內容的需求。但是某些場景下&#xff0c;我們批量修改 Excel 文檔內容的場景比較復雜&#xff0c;比…

SGLang Router:基于緩存感知負載均衡的數據并行路由實踐

SGLang Router&#xff1a;基于緩存感知負載均衡的數據并行路由實踐 一、引言二、安裝與快速啟動三、兩種工作模式對比3.1 協同啟動模式&#xff08;單節點&#xff09;3.2 獨立啟動模式&#xff08;多節點&#xff09; 四、動態擴縮容API4.1 添加Worker節點4.2 移除Worker節點…

在人工智能軟件的幫助下學習編程實例

1 引言 本文記錄在人工智能軟件的幫助下學習一種全新的編程環境的實例&#xff0c;之所以提人工智能軟件而不是單指DeepSeek&#xff0c;一方面DeepSeek太火了&#xff0c;經常服務器繁忙&#xff0c;用本機本地部署的最多運行70b模型&#xff0c;又似乎稍差。另一方面也作為一…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_modules

定義在 objs\ngx_modules.c #include <ngx_config.h> #include <ngx_core.h>extern ngx_module_t ngx_core_module; extern ngx_module_t ngx_errlog_module; extern ngx_module_t ngx_conf_module; extern ngx_module_t ngx_openssl_module; extern ngx_modul…

深度學習代碼解讀——自用

代碼來自&#xff1a;GitHub - ChuHan89/WSSS-Tissue 借助了一些人工智能 2_generate_PM.py 功能總結 該代碼用于 生成弱監督語義分割&#xff08;WSSS&#xff09;所需的偽掩碼&#xff08;Pseudo-Masks&#xff09;&#xff0c;是 Stage2 訓練的前置步驟。其核心流程為&a…

Java基礎面試題全集

1. Java語言基礎 1.1 Java是什么&#xff1f; ? Java是一種廣泛使用的編程語言&#xff0c;最初由Sun Microsystems&#xff08;現為Oracle公司的一部分&#xff09;于1995年發布。它是一種面向對象的、基于類的、通用型的編程語言&#xff0c;旨在讓應用程序“編寫一次&…

Selenium遇到Exception自動截圖

# 隨手小記 場景&#xff1a;測試百度&#xff1a; 點擊新聞&#xff0c;跳轉到新的窗口&#xff0c;找到輸入框&#xff0c;輸入“hello,world" 等到輸入框的內容是hello,world, 這里有個錯誤&#xff0c;少了一個] 后來就實現了錯誤截圖的功能&#xff0c;可以參考 …

【神經網絡】python實現神經網絡(一)——數據集獲取

一.概述 在文章【機器學習】一個例子帶你了解神經網絡是什么中&#xff0c;我們大致了解神經網絡的正向信息傳導、反向傳導以及學習過程的大致流程&#xff0c;現在我們正式開始進行代碼的實現&#xff0c;首先我們來實現第一步的運算過程模擬講解&#xff1a;正向傳導。本次代…

Sentinel 筆記

Sentinel 筆記 1 介紹 Sentinel 是阿里開源的分布式系統流量防衛組件&#xff0c;專注于 流量控制、熔斷降級、系統保護。 官網&#xff1a;https://sentinelguard.io/zh-cn/index.html wiki&#xff1a;https://github.com/alibaba/Sentinel/wiki 對比同類產品&#xff1…

manus本地部署方法研究測試

Manus本地部署方法&#xff0c;Manus邀請碼實在太難搞了&#xff0c;昨晚看到有一個團隊&#xff0c;5個人3個小時&#xff0c;一個完全免費、無需排隊等待的OpenManus就做好了。 由于也是新手&#xff0c;找了好幾輪&#xff0c;實在是沒有找到合適的部署方法&#xff0c;自己…

FreeRTOS第15篇:FreeRTOS鏈表實現細節03_List_t與ListItem_t的奧秘

文/指尖動聽知識庫-星愿 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:深入FreeRTOS內核:從原理到實戰的嵌入式開發指南 1 FreeRTOS列表的核心數據結構 FreeRTOS的列表實現由兩個關鍵結構體組成:List_t(列表)和ListItem_t(列表項)。它們共同…

gzip壓縮

什么是Gzip 前端優化&#xff1a;開啟Gzip壓縮_前端開啟gzip壓縮-CSDN博客 Gzip是一種文件壓縮算法&#xff0c;減少文件大小&#xff0c;節省帶寬從而提減少網絡傳輸時間&#xff0c;網站會更快地加載。 如何判斷是否開啟&#xff1a; 請求頭&#xff1a;服務端會通過客戶…

機器學習在地圖制圖學中的應用

原文鏈接&#xff1a;https://www.tandfonline.com/doi/full/10.1080/15230406.2023.2295948#abstract CSDN/2025/Machine learning in cartography.pdf at main keykeywu2048/CSDN GitHub 核心內容 本文是《制圖學與地理信息科學》特刊的擴展評論&#xff0c;系統探討了機…

智慧消防新篇章:4G液位/壓力傳感器,筑牢安全防線!

火災無情&#xff0c;防患未“燃”&#xff01;在智慧消防時代&#xff0c;如何實現消防水系統的實時監測、預警&#xff0c;保障人民生命財產安全&#xff1f;山東一二三物聯網深耕物聯網領域&#xff0c;自主研發4G液位、4G壓力智能傳感器&#xff0c;為智慧消防水位、水壓無…

set、LinkedHashSet和TreeSet的區別、Map接口常見方法、Collections 工具類使用

DAY7.2 Java核心基礎 想學習Collection、list、ArrayList、Set、HashSet部分的小伙伴可以轉到 7.1集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判斷兩個對象是否相等文章查看 set集合 在set集合中&#xff0c;處理LinkedHashSet是有序的&#xf…

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目錄 1. git update-git-for-windows 報錯2. 解決方案2.1. 更新 CA 證書庫2.2. 使用 SSH 連接&#xff08;推薦&#xff09;2.3 禁用 SSL 驗證&#xff08;不推薦&#xff09; 1. git update-git-for-windows 報錯 LenovoLAPTOP-EQKBL89E MINGW64 /d/YHProjects/omni-channel-…

《深度剖析架構蒸餾與邏輯蒸餾:探尋知識遷移的差異化路徑》

在人工智能模型優化的前沿領域&#xff0c;架構蒸餾與邏輯蒸餾作為知識蒸餾的關鍵分支&#xff0c;正引領著模型小型化與高效化的變革浪潮。隨著深度學習模型規模與復雜度的不斷攀升&#xff0c;如何在資源受限的情況下&#xff0c;實現模型性能的最大化&#xff0c;成為了學術…

先序二叉樹的線索化,并找指定結點的先序后繼

#include<stdio.h> #include<stdlib.h> #define elemType char //線索二叉樹結點 typedef struct ThreadNode{ elemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag;//用來判斷一個結點是否有線索 }ThreadNode,*ThreadTree; //全局變量…

螞蟻集團轉正實習大模型算法崗內推

1.負責以大模型為代表的A轉術能力的建設和優化&#xff0c;打造業界領先的A(技術系統&#xff0c;主要職責包括A系統結構設計、RAG 系統開發、大模型凱練數據構建、大模型能力評測、大模型準理效果和效率優化等 2.緊密跟蹤、探索大模型方向前沿技術&#xff0c;依托豐富目體系化…

未授權漏洞大賞

ActiveMQ未授權訪問漏洞 漏洞描述 Apache ActiveMQ是美國阿帕奇&#xff08;Apache&#xff09;軟件基金會所研發的一套開源的消息中間件&#xff0c;它支持Java消息服務、集群、Spring Framework等。 Apache ActiveMQ管理控制臺的默認管理用戶名和密碼分別為admin和admin&am…