DirectX12(D3D12)基礎教程七 深度模板視圖\剔除\謂詞

本章主要講遮擋,作者認為比較復雜有難度的知識點,作為基礎教程不會深入講解。

GPU渲染管線

主要包括以下階段

  1. 輸入裝配(IA):讀取頂點數據 ,定義頂點數據結構
  2. 頂點著色(VS):變換頂點到屏幕空間,Shader程序VSMain()
  3. 曲面細分 & 幾何著色(HS/DS/GS,可選)
  4. 光柵化(Rasterization):將 3D 物體轉換為 2D 像素
  5. 像素著色(PS):計算最終顏色
  6. 輸出合并(OM):寫入顏色緩沖 & 深度緩沖

光柵化(Rasterization):指的是通過頂點數據找到屏幕中需要顯示的像素的過程,通過光柵化,我們將空間上連續的線條轉化為屏幕中離散的像素(頂點數據到像素點),由硬件實現。

比如 在光柵化階段時 使用 Z-Buffer(深度緩沖) 進行深度測試(Depth Test),決定像素是否可見。流程:

  1. 片元深度值 與 Z-Buffer 進行比較
  2. 深度測試通過 → 繼續執行像素著色器(PS)
  3. 深度測試失敗 → 丟棄像素,不執行 PS

深度模板視圖 (DSV)

深度模板視圖用于訪問深度緩沖模板緩沖資源。深度緩沖用來存儲每個像素的深度值,以此來判定哪些像素該被渲染,哪些該被舍棄。模板緩沖則存儲每個像素的模板值,可用于實現如陰影、遮罩這類特效。

D3D12中的剔除(Culling)是指從渲染過程中排除那些不需要渲染的對象,以減少計算量和提高渲染效率。

深度緩沖

深度緩沖區(或 z-Buffer 緩沖區)存儲深度信息,以控制渲染(而不是從視圖中隱藏)哪些多 邊形區域。

模板緩沖

模板緩沖區用于遮罩圖像中的像素,以產生特殊效果。 掩碼控制是否繪制像素。 特殊效 果包括合成、貼紙、溶解、淡化、滑動、輪廓描繪和剪影,以及雙面模板。

模板緩沖通過模板測試來決定哪些像素點可以被渲染。當啟動模板測試時,片段像素點的值與模板緩沖區中的值進行比較,根據比較結果決定該像素點是否應該被繪制。模板測試的具體過程包括設置參考值和掩碼,并根據測試結果對模板緩沖區的值進行相應的修改

具體應用場景

  1. 鏡像效果:在渲染鏡子時,模板緩沖區可以用來阻止鏡子范圍以外的鏡像部分被繪制,從而只顯示鏡子中的反射部分
  2. 遮罩效果:通過設置模板緩沖區的值,可以實現遮罩效果,只渲染特定區域的像素,從而實現一些特殊的圖形效果
  3. 光照和陰影效果:模板緩沖區可以用于實現光照和陰影效果,通過在渲染過程中對模板緩沖區進行修改,可以模擬光照的效果

創建深度模板視圖(DSV)

1. 填充D3D12_DEPTH_STENCIL_VIEW_DESC結構

2.填充 D3D12_CLEAR_VALUE結構 并 創建資源 (CreateCommittedResource())

3. 通過CreateDepthStencilView()創建 深度模板視圖 (DSV)

剔除

剔除的定義和作用

剔除是指在渲染過程中,根據一定的規則,將那些不會出現在最終視圖中的對象或面片從渲染列表中移除,從而減少GPU的工作量,提高渲染效率和幀率。剔除技術主要包括以下幾種:

背面剔除(Backface Culling):這是最常見的剔除技術,它只渲染面向攝像機的面,背對攝像機的面則不進行渲染。背面剔除可以顯著減少需要處理的幾何體數量,因為大多數場景中的物體只有一面是可見的。

視錐體剔除(Frustum Culling):視錐體剔除是通過判斷物體是否在攝像機的視錐體內來決定是否渲染該物體。只有完全在視錐體內的物體才會被渲染,這樣可以有效減少不必要的渲染計算。

遮擋剔除(Occlusion Culling):遮擋剔除是通過預先計算的遮擋信息來決定哪些物體可以被其他物體遮擋而不需要渲染。這種方法通常用于靜態場景,可以顯著減少需要渲染的物體數量。

謂詞

D3D12中的謂詞(Predicate)主要用于控制渲染操作的條件執行。謂詞可以是一個布爾表達式,用于決定是否執行某些渲染命令。在D3D12中,謂詞通常與命令列表(Command List)一起使用,以實現條件渲染。

謂詞在D3D12中的作用主要體現在以下幾個方面:

1.?? ?條件渲染:通過謂詞,開發者可以控制渲染操作是否執行。例如,可以根據時間、用戶輸入或其他條件來決定是否渲染某個對象。

2.?? ?性能優化:通過條件渲染,可以減少不必要的渲染操作,從而節省資源并提高渲染效率。

使用D3D12中的謂詞通常涉及以下步驟:

定義謂詞:創建一個布爾表達式或函數,該表達式根據特定條件返回true或false。

設置命令列表:在命令列表中設置謂詞,指定哪些渲染操作需要基于該謂詞的條件執行。

執行命令列表:當謂詞條件滿足時,命令列表中的相關渲染命令才會被執行。

void SetPredication([in, optional] ID3D12Resource *pBuffer,UINT64                         AlignedBufferOffset,D3D12_PREDICATION_OP           Operation
);

當 GPU 執行 SetPredication 命令時,它會提取緩沖區中的值快照。 緩沖區中數據的未來更改不會追溯性地影響預測狀態。

如果輸入參數緩沖區(pBuffer)為 NULL,則禁用預測。
D3D12 API 中不存在謂詞提示;直接、計算和復制命令列表允許進行謂詞。 源緩沖區可以位于任何堆類型(默認、上傳、讀取、自定義)。

?D3D12代碼示例http://GitHub - microsoft/DirectX-Graphics-Samples: This repo contains the DirectX Graphics samples that demonstrate how to build graphics intensive applications on Windows.其中D3D12PredicationQueries 示例渲染了兩個四邊形;其中一個會動起來,周期性地遮擋另一個。對于每個渲染的幀,執行一個二進制遮擋查詢,并使用setpredicate API來有條件地繪制潛在遮擋的四邊形。當查詢確定四邊形被完全遮擋時,不執行渲染(隱藏一個四邊形)。


感謝大家的支持,如要問題歡迎提問指正。
?

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

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

相關文章

溫補晶振(TCXO)穩定性優化:從實驗室到量產的關鍵技術

在現代通信、航空航天、5G基站等對頻率穩定性要求極高的領域,溫補晶振(TCXO)扮演著不可或缺的角色。其穩定性直接影響系統的性能與可靠性,因此,對TCXO穩定性優化技術的研究與實踐至關重要。 一、溫度補償算法&#xff…

C++,設計模式,【建造者模式】

文章目錄 通俗易懂的建造者模式:手把手教你造電腦一、現實中的建造者困境二、建造者模式核心思想三、代碼實戰:組裝電腦1. 產品類 - 電腦2. 抽象建造者 - 裝機師傅3. 具體建造者 - 電競主機版4. 具體建造者 - 辦公主機版5. 指揮官 - 裝機總控6. 客戶端使…

前端基礎之《Vue(13)—重要API》

重要的API 一、nextTick() 1、寫法 Vue.$nextTick()或者this.$nextTick() 原因: set操作代碼是同步的,但是代碼背后的行為是異步的。set操作修改聲明式變量,觸發re-render生成新的虛擬DOM,進一步執行diff運算,找到…

Windows 中搭建 browser-use WebUI 1.4

目錄 1. 背景介紹2. 搭建過程3. 補充 1. 背景介紹 背景:想要在 Windows 中復現 browser-use WebUI pickle反序列化漏洞,該漏洞在 v1.7 版本中已經修復,所以需要搭建 小于 1.7 版本的環境,我這里搭建的是 1.4 版本。 項目地址&am…

【數據通信完全指南】從物理層到協議棧的深度解析

目錄 1. 通信技術演進與核心挑戰1.1 從電報到5G的技術變遷1.2 現代通信系統的三大瓶頸 2. 通信系統架構深度解構2.1 OSI七層模型運作原理2.2 TCP/IP協議棧實戰解析 3. 物理層關鍵技術實現3.1 信號調制技術演進路線3.2 信道復用方案對比 4. 數據傳輸可靠性保障4.1 CRC校驗算法數…

CMD與PowerShell:Windows命令行工具的對比與使用指南

CMD與PowerShell:Windows命令行工具的對比與使用指南 文章目錄 CMD與PowerShell:Windows命令行工具的對比與使用指南引言1. CMD(命令提示符)簡介1.1 什么是CMD?1.2 CMD的特點1.3 常用CMD命令示例1.4 CMD的優勢與局限 2…

93. 后臺線程與主線程更新UI Maui例子 C#例子

在.NET MAUI開發中,多線程是常見的需求,但UI更新必須在主線程上執行。今天,我們來探討一個簡單而優雅的解決方案:MainThread.InvokeOnMainThreadAsync。 一、背景 在跨平臺應用開發中,后臺線程常用于執行耗時操作&am…

海思正式公開了星閃BS21E的SDK

今天海思正式在Gitee平臺發布了BS21E的SDK:fbb_bs2x: fbb_bs2x代碼倉為支持bs21e解決方案SDK。技術論壇:https://developers.hisilicon.com/forum/0133146886267870001 fbb_bs2x代碼倉為支持bs21e解決方案SDK,該SDK包從統一開發平臺FBB&#…

QML學習:使用QML實現抽屜式側邊欄菜單

文章目錄 前言一、環境配置二、實現步驟三、示例完整代碼四、注意事項總結 前言 最近在進行QML的學習,發現一個比較有意思的交互設計:抽屜式側邊欄菜單,出于開發實戰需求,最終實現了一個支持手勢拖拽、彈性動畫、蒙層效果和??智…

峰終定律——AI與思維模型【85】

一、定義 峰終定律思維模型是指人們對一段經歷的評價主要取決于這段經歷中的高峰時刻(無論是正向的還是負向的)以及結束時的感受,而不是整個經歷的平均感受。也就是說,如果在一段體驗的高峰和結尾階段給人們留下積極、強烈的印象…

【補題】Codeforces Round 664 (Div. 1) A. Boboniu Chats with Du

題意:給出n,d,m三個值,分別代表,有多少個值ai,使用超過m的ai,需要禁言d天,如果不足也能使用,m代表區分點,問能得到最大的值有多少。 思路: …

單片機與上位機串口通信:原理、應用與實踐

注:本文為 “單片機與上位機串口通信” 相關文章合輯。 略作重排,未整理去重。 如有內容異常,請看原文。 單片機與上位機的串行通信 饕餮 tt 于 2019 - 12 - 06 14:47:19 發布 寫在前面 本文主要記錄單片機通過 TXD、RXD 與上位機進行數據…

996引擎-人物模型(UIModel):創建內觀時裝備偏移問題

996引擎-人物模型(UIModel):創建內觀時裝備偏移問題 創建 人物模型(UIModel)問題參考資料創建 人物模型(UIModel) 90、91 是自定義劍甲的穿戴位置,因為需求只需要顯示劍甲,所以下面創建人物模型時,只給了劍甲的id、特效。 function Controller:updateUI()-- 自定義收拾…

Python小程序:上班該做點摸魚的事情

系統提醒 上班會忘記一些自己的事,所以你需要在上班的的時候突然給你彈窗,你就知道要做啥了 源碼 這里有一個智能家居項目可以看看(開源) # -*- coding:utf-8 -*- """ 作者:YTQ 日期: 2025年04日29 21:51:24 """ impor…

centos安裝部署配置kafka

1、解壓到目錄 tar -zxvf kafka_2.13-2.8.2.tgz -C /usr/local/kafka2.進入目錄 cd /usr/local/kafka/kafka_2.13-2.8.23.查看版本(驗證是否已解壓) bin/kafka-topics.sh --version4.修改配置,注意:此配置中有一個默認的zookee…

深?理解指針(7)

1.函數指針變量的創建 在x86環境下: 我們發現:以函數是有地址的,函數名就是函數的地址,當然也可以通過& 函數名 的?式獲得函數的地址。 如果我們要將函數的地址存放起來,就得創建函數指針變量咯,函數…

AdaBoost算法的原理及Python實現

一、概述 AdaBoost(Adaptive Boosting,自適應提升)是一種迭代式的集成學習算法,通過不斷調整樣本權重,提升弱學習器性能,最終集成為一個強學習器。它繼承了 Boosting 的基本思想和關鍵機制,但在…

《PyTorch documentation》(PyTorch 文檔)

PyTorch documentation(PyTorch 文檔) PyTorch is an optimized tensor library for deep learning using GPUs and CPUs. (PyTorch是一個優化的張量庫,用于使用GPU和CPU進行深度學習。) Features described in this documentation are classified by release status: (此…

Android學習總結之算法篇六(數組和棧)

括號匹配 public static boolean isValid(String s) {// 創建一個棧用于存儲左括號Stack<Character> stack new Stack<>();// 遍歷字符串中的每個字符for (char c : s.toCharArray()) {if (c ( || c [ || c {) {// 如果是左括號&#xff0c;將其壓入棧中stack…

遺傳算法(Genetic Algorithm,GA)

遺傳算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一種受生物進化理論啟發的優化算法&#xff0c;通過模擬自然選擇和遺傳機制來搜索復雜問題的最優解。 ??核心原理?? ??自然選擇與適者生存??&#xff1a;適應度高的個體更有可能繁殖&#xff0c;將…