利用 Direct3D 绘制几何体—10.几何图形辅助结构体

ops/2024/11/2 0:51:05/

在本书中,我们通过创建一个同时存有顶点缓冲区和索引缓冲区的结构体来方便地定义多个几何体。另外,借此结构体即可将顶点和索引数据置于系统内存之中,以供 CPU 读取。例如,执行拾取(picking)和碰撞检测(collision detection)这样的工作就需要 CPU 来访问几何体数据。再者,该结构体还缓存了顶点缓冲区和索引缓冲区的一些重要属性(例如格式和每个顶点项所占用的字节数),并提供了返回缓冲区视图的方法。当需要定义多个几何体时,我们就使用下面的 MeshGeometry(定义于 d3dUtil.h头文件中)结构体。

// d3dUtil.h 第149行
// 利用 SubmeshGeometry 来定义 MeshGeometry 中存储的单个几何体
// 此结构体适用于将多个几何体数据存于一个顶点缓冲区和一个索引缓冲区的情况
// 它提供了对存于顶点缓冲区和索引缓冲区中的单个几何体进行绘制所需的数据和偏移量,我们可以据此来
// 实现图6.3中所描绘的技术
struct SubmeshGeometry
{UINT IndexCount = 0;UINT StartIndexLocation = 0;INT BaseVertexLocation = 0;// 通过此子网格来定义当前 SubmeshGeometry 结构体中所存几何体的包围盒(bounding box)。我们// 将在本书的后续章节中使用此数据DirectX::BoundingBox Bounds;
};struct MeshGeometry
{// 指定此几何体网格集合的名称,这样我们就能根据此名找到它std::string Name;// 系统内存中的副本。由于顶点/索引可以是泛型格式(具体格式依用户而定),所以用 Blob 类型来表示// 待用户在使用时再将其转换为适当的类型Microsoft::WRL::ComPtr<ID3DBlob> VertexBufferCPU = nullptr;Microsoft::WRL::ComPtr<ID3DBlob> IndexBufferCPU = nullptr;Microsoft::WRL::ComPtr<ID3D12Resource> VertexBufferGPU = nullptr;Microsoft::WRL::ComPtr<ID3D12Resource> IndexBufferGPU = nullptr;Microsoft::WRL::ComPtr<ID3D12Resource> VertexBufferUploader = nullptr;Microsoft::WRL::ComPtr<ID3D12Resource> IndexBufferUploader = nullptr;// 与缓冲区相关的数据UINT VertexByteStride = 0;UINT VertexBufferByteSize = 0;DXGI_FORMAT IndexFormat = DXGI_FORMAT_R16_UINT;UINT IndexBufferByteSize = 0;// 一个 MeshGeometry 结构体能够存储一组顶点/索引缓冲区中的多个几何体// 若利用下列容器来定义子网格几何体,我们就能单独地绘制出其中的子网格(单个几何体)std::unordered_map<std::string, SubmeshGeometry> DrawArgs;D3D12_VERTEX_BUFFER_VIEW VertexBufferView()const{D3D12_VERTEX_BUFFER_VIEW vbv;vbv.BufferLocation = VertexBufferGPU->GetGPUVirtualAddress();vbv.StrideInBytes = VertexByteStride;vbv.SizeInBytes = VertexBufferByteSize;return vbv;}D3D12_INDEX_BUFFER_VIEW IndexBufferView()const{D3D12_INDEX_BUFFER_VIEW ibv;ibv.BufferLocation = IndexBufferGPU->GetGPUVirtualAddress();ibv.Format = IndexFormat;ibv.SizeInBytes = IndexBufferByteSize;return ibv;}// 待数据上传至 GPU 后,我们就能释放这些内存了void DisposeUploaders(){VertexBufferUploader = nullptr;IndexBufferUploader = nullptr;}
};


http://www.ppmy.cn/ops/130276.html

相关文章

MATLAB与STK互联:仿真并获取低轨卫星与指定区域地面站的可见性数据

MATLAB控制STK实现&#xff1a;仿真并获取低轨卫星与指定区域地面站的可见性数据 本次仿真主要参考了多篇文献和网站&#xff0c;包括但不限于&#xff1a;《Using MATLAB for STK Automation》、CSDN博文&#xff1a; 拜火先知的博客_CSDN博客-笔记、AGI官网有关MATLAB的内容…

图书管理系统汇报

【1A536】图书管理系统汇报 项目介绍1.用户登录注册功能1. 1用户角色管理2.图书管理功能2.1 添加图书2.2 编辑图书2.3 删除图书 3.图书搜索和筛选3.1 图书搜索3.2 图书筛选 4.图书借阅、图书归还4.1 图书借阅4.2 图书归还 5.用户信息管理5.1上传头像5.2修改头像5.3 修改密码 项…

虚拟机 Ubuntu 扩容

文章目录 一、Vmware 重新分配 Ubuntu 空间二、Ubuntu 扩容分区 一、Vmware 重新分配 Ubuntu 空间 先打开 Vmware &#xff0c;选择要重新分配空间的虚拟机 点击 编辑虚拟机设置 &#xff0c;再点击 硬盘 &#xff0c;再点击 扩展 选择预计扩展的空间&#xff0c;然后点击 扩展…

redis windows 7.0 下载

Redis 简介 Redis 是一个高性能的 key-value 数据库&#xff0c;广泛应用于缓存、消息队列、实时分析等场景。它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等&#xff0c;并且提供了丰富的操作命令&#xff0c;能够满足各种复杂的数据处理需求。 下载…

leetcode hot100【LeetCode 279. 完全平方数】java实现

LeetCode 279. 完全平方数 题目描述 给定一个正整数 n&#xff0c;你需要找到若干个完全平方数&#xff08;比如 1, 4, 9, 16, ...&#xff09;&#xff0c;使得它们的和等于 n。你需要返回最少的完全平方数的个数。 示例 1: 输入: n 12 输出: 3 解释: 12 4 4 4示例 2…

OB_GINS_day3

这里写目录标题 实现当前状态初始化实现预积分的初始化由于此时preintegration_options 是3&#xff08;也就是考虑odo以及earth rotation&#xff09;为预积分的容器添加需要积分的IMU积分因子接下来是添加新的IMU到preintegration中 实现当前状态初始化 这个state_curr的主要…

[供应链] 邀请招标

1.邀请招标定义 邀请招标(Invitation to Bid by Request) 也称为有限竞争性招标(limited Competitive Bidding)或选择性招标(Selected Bidding) 邀请招标的采购方式下&#xff0c;采购人(如政府机构、企业或其他组织)不是公开发布招标信息&#xff0c;而是根据供应商或承包商…

unity3d————三角函数练习题

先上代码&#xff1a; public class SinCos : MonoBehaviour {public float moveSpeed 10f; //前进的速度public float changValue 5f; //左右的速度public float changeSize 5f; //左右的幅度float time 0;void Update(){this.transform.Translate(Vector3.forwa…