DirectX12 - Pipeline(管线)之IA

news2024/11/20 19:40:46

这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互动,知无不言:

DirectX12 Spec 总目录

目录

  • 1. 什么是IA?
  • 2. IA如何工作?
    • 2.1 Vertex Buffer & VBV
    • 2.2 Index Buffer & IBV

1. 什么是IA?

  • IA全称Input Assembly,是整个渲染管线的入口。IA阶段会从显存中读取几何数据,包括Vertex Data和Index Data,再将它们装配成几何图元(Geometric Primitive)(例如Triangle和Line这种构成图形的基本元素)
  • DirectX12整个渲染管线主要包括IA、VS、HS、TS、DS、GS(STO)、RS、PS、OM。
  • IA即是整个渲染管线的入口,负责将渲染所需要的Vertex BufferIndex Buffer中的数据给到管线中,然后经过各个渲染阶段,最后渲染好的数据从OM输出到Render Targets,也可以直接从STO输出所需要的数据。

2. IA如何工作?

  • 关于IA的工作流程,需要关心以下几点:Vertex Buffer & VBV、Index Buffer & IBV、Input Layout以及Primitive Topology这几点,接下来我分别阐述各个点的细节。

2.1 Vertex Buffer & VBV

  • 几何图形一般是由Triangle和Line这两种基本元素构成的,而Triangle和Line这两种基本元素都可以用Vertex的集合来表示,例如Triangle可以用3个Vertex的集合表示,同理Line可以用2个表示。
  • 所以在DirectX12的IA阶段,用户输入Vertex Data,然后指定图元拓扑结构(Primitive Topology),在IA中就可以将这些数据装配成几何图形
  • 例如一个Triangle图形,由Ver0、Ver1、Ver2三个Vertex构成,我们就可以将每个Vertex的属性抽象成MyVertex结构体,然后把整个Vertex数据Copy到事先创建好的Vertex Buffer中:
    TriangleVertex
// 自定义Vertex结构体
struct MyVertex
{
    XMFLOAT3 Pos;
    XMFLOAT4 Color;
}

// 自定义Ver0/1/2数据
Vertex vertices[] = 
{
    // Ver0
    { XMFLOAT3(0.0f, 0.0f, 0.0f), XMFLOAT4(Colors::Red) },
    // Ver1
    { XMFLOAT3(1.0f, 1.0f, 0.0f), XMFLOAT4(Colors::Blue) },
    // Ver2
    { XMFLOAT3(2.0f, 0.0f, 0.0f), XMFLOAT4(Colors::Yellow) },
};

// 创建好Vertex Buffer Resource, 并将vertices中的数据copy到VertexBuffer中
ComPtr<ID3D12Resource> VertexBuffer = ...

// 调用IASetVertexBuffers()设置Vertex Buffer
IASetVertexBuffers()
  • 拿到Vertex Buffer之后,我们不能直接将它传给IA Stage,因为GPU不知道怎样去解析这段数据,这就要用到我们之前说的Descriptor的概念,我们将Vertex Buffer封装成VBV(Vertex Buffer View),将其指定到IA中,GPU就能按照我们指定的参数解析Vertex Buffer Data:
// VBV结构体参数
typedef struct D3D12_VERTEX_BUFFER_VIEW {
  D3D12_GPU_VIRTUAL_ADDRESS BufferLocation;
  UINT                      SizeInBytes;
  UINT                      StrideInBytes;
} D3D12_VERTEX_BUFFER_VIEW;

// 结合我们前面定义的MyVertex结构体,我们可以这样填写VBV参数
D3D12_VERTEX_BUFFER_VIEW vbv = { 0 };
vbv.BufferLocation = VertexBuffer->GetGPUVirtualAddress();
vbv.StrideInBytes = sizeof(MyVertex);
vbv.SizeInBytes = 3 * sizeof(MyVertex);

// 最后我们可以把填写好的VBV指定到IA中,其包含了Vertex Buffer的所有信息
D3D12_VERTEX_BUFFER_VIEW vbvArray[1] = { vbv };
IASetVertexBuffers(0, 1, vbvArray);
  • 当然以上流程只是说了个大概,还有许多DX12编程方面的细节没有提及,暂且不关心,目前只描述思路。

2.2 Index Buffer & IBV

  • 未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原来服务端的退出姿势也可以这么优雅

最简单的 http 服务端 咱们来写一个简单的 http 服务器 func main() { srvMux : http.NewServeMux() srvMux.HandleFunc("/getinfo", getinfo) http.ListenAndServe(":9090", srvMux)}func getinfo(w http.ResponseWriter, r *http.Request) { fmt.Printl…

程序猿入门|编程注重写注释,代码规范注释有哪些讲究?

注释风格 1.总述 一般使用 // 或 /* */,只要统一就好。 2.说明 // 或 /* */ 都可以,但 // 更 常用,要在如何注释及注释风格上确保统一。 文件注释 1.总述 在每一个文件开头加入版权、作者、时间等描述。 文件注释描述了该文件的内容,如果一个文件只声明,或实现,或测试…

JVM运行时参数

3.类型三&#xff1a;-XX参数选项 特点 作用 用于开发和调试jvm 分类 特别地 二、添加jvm参数选项 1.运行jar包 2.通过Tomcat运行war包 3.程序运行过程中 三、常用的JVM参数选项 1.打印设置的XX选项及值 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210219105124…

window安装torch环境--不踩坑须知!

window安装torch环境–不踩坑须知&#xff01; 1. 查看电脑安装的cudn版本 进入cmd输入&#xff1a; nvidia-smi2.查找cuda对应的torch版本 在官网查找&#xff1a;https://pytorch.org/get-started/previous-versions/ 如果呢你在新建的conda环境里输入该命令&#xff0c;…

Java基于JSP的网络音乐KTV点歌电台网站

随着我国网民的增加,也促进了网络音乐电台的开发。随着网络技术的发展,人们在利用网络学习的同时,也在享受着网络带来的各种附带产品所产生的效应,如网络游戏,网络歌曲。网络音乐电台正是在这样的需求前提下应运而生,给人们的日常生活带来了极大的乐趣,让人们在繁忙疲惫的工作之…

TensorRT从理论到实践

TensorRT理论 一. TensorRT介绍 TensorRT是一个高性能的深度学习推理优化器&#xff0c;可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现已能支持Tensorflow、Caffe、Mxnet、Pytorc…

《嵌入式基础》实验三 ARM编程模型和ARM指令

零、前言 本人不擅长写汇编相关的东西&#xff0c;所以以下内容也是不断摸索&#xff08;百度 &#xff09; 整出来的&#xff0c;和linux的实验报告的质量相比较低。 一、 实验目的 掌握ARM微处理器的汇编指令的使用方法。掌握使用 LDM/STM&#xff0c;B&#xff0c;BL 等指…

Struts、Struts2、Spring MVC、JSF、AngularJS、React以及Vue的对比

Struts是一种Java语言的Web应用框架&#xff0c;用于构建基于Java的Web应用程序。它旨在为开发人员提供一种简单易用的方法来构建动态Web页面。Struts框架提供了一组组件&#xff0c;用于处理常见的Web应用程序任务&#xff0c;包括处理用户输入&#xff0c;验证用户输入&#…

(算法设计与分析)第七章随机化算法概述

文章目录一&#xff1a;概述&#xff08;1&#xff09;什么是随机化算法&#xff08;2&#xff09;随机化算法的特点&#xff08;3&#xff09;随机化算法分类&#xff08;4&#xff09;随机数二&#xff1a;数值随机化算法&#xff08;以计算πππ值为例&#xff09;三&#…

分布式计算 MapReduce 究竟是怎么一回事?

前言 如果要对文件中的内容进行统计&#xff0c;大家觉得怎么做呢&#xff1f;一般的思路都是将不同地方的文件数据读取到内存中&#xff0c;最后集中进行统计。如果数据量少还好&#xff0c;但是面对海量数据、大数据的场景这样真的合适吗&#xff1f;不合适的话&#xff0c;…

操作系统装完之后,安装几个特别有用的经典软件,都是电脑必备,包含pdf编辑、图片编辑、wiki、压缩、影音等等

操作系统装完之后&#xff0c;安装几个特别有用的经典软件&#xff0c;都是电脑必备&#xff0c;包含pdf编辑、图片编辑、wiki、压缩、影音等等。 Gimp https://www.gimp.org/ Gimp 是一款小巧实用的图片编辑工具。 如果你不想用笨重的PS&#xff0c;那可以尝试一下Gimp&…

元胞自动机模拟病毒传染(SEIR模型)(Python代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

SSM整合-如何配置相关文件

下述操作都是在IDEA上进行 1.首先新建一个Maven工程。 2.在pom.xml中增加相关依赖 <properties><spring.version>5.3.1</spring.version></properties><dependencies><dependency><groupId>org.springframework</groupId>&l…

安卓玩机搞机技巧综合资源----手机各种代码 查询信息 开启端口 调试选项【十】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

踩坑Xxljob本地部署后调度一半成功一半失败原因分析及解决方案记录

缘由 入门学习和本地部署Xxljob过程中&#xff0c;发现Xxljob任务一半调度成功&#xff0c;一半调度失败&#xff0c;给我邮箱发爆了&#xff0c;为啥呢&#xff1f;查了半天资料都没解决 成功比例图&#xff1a; 实际操作时&#xff0c;发现单次手动执行一定成功&#xff0…

Python之数据库编程

目录 一、MySQL数据库的使用 数据库相关操作 二、数据库增删改查 增加 修改 删除 三、数据库标准写法 一、MySQL数据库的使用 建表 CREATE TABLE py_student( id INTEGER primary key auto_increment, name INTEGER not null, gender varchar(11) default 男 , birthday d…

CMake中define_property的使用

CMake中的define_property命令用于定义和记录自定义属性&#xff0c;其格式如下&#xff1a; define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |TEST | VARIABLE | CACHED_VARIABLE>PROPERTY <name> [INHERITED][BRIEF_DOCS <brief-doc> [docs...]]…

php+vue基于微信小程序的在线挂号预约小程序

网络的广泛应用给生活带来了十分的便利。所以把在线挂号管理与现在网络相结合&#xff0c;利用ThinkPHP5技术建设在线挂号微信小程序&#xff0c;实现在线挂号的信息化。则对于进一步提高在线挂号管理发展&#xff0c;丰富在线挂号管理经验能起到不少的促进作用。 在线挂号微信…

在飞书搞了个机器人,我让ChatGPT帮忙写算法

一、前言 环境&#xff1a; 系统&#xff1a;Windows 11 64位 Python版本&#xff1a;Python 3.9 注&#xff1a;本文不讲怎么实现&#xff0c;只讲实现的效果和一些思考。大家感兴趣再考虑去配置相关机器人。 先来问问ChatGPT两个问题&#xff1a; 1、ChatGPT是什么&#xff…

Java面试题总结-面向对象

面试题总结第一篇面向对象面向对象和面向过程的区别面向对象三大特性Java是如何实现多态的面向对象 面向对象和面向过程的区别 面向过程&#xff1a; 优点&#xff1a;性能比面向对象高&#xff0c;因为类调用时需要实例化&#xff0c;开销比较大&#xff0c;比较消耗资源;比如…