本章主要讲遮挡,作者认为比较复杂有难度的知识点,作为基础教程不会深入讲解。

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;将…