D3D12渲染技术之几何辅助结构

2023-10-11 16:59

本文主要是介绍D3D12渲染技术之几何辅助结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们绘制一个立方体需要一组顶点和索引,将顶点和索引缓冲区组合在一起可以定义一组几何图形的结构, 此外,该结构的顶点和索引数据是在系统内存中的,以便CPU可以读取它, CPU需要访问几何数据以进行拾取和碰撞检测。 每当我们定义几何时,我们使用以下MeshGeometry(在d3dUtil.h中定义)结构。

// Defines a subrange of geometry in a MeshGeometry. This is for when
// multiple geometries are stored in one vertex and index buffer. It
// provides the offsets and data needed to draw a subset of geometry 
// stores in the vertex and index buffers so that we can implement the 
// technique described by Figure 6.3.
struct SubmeshGeometry
{UINT IndexCount = 0;UINT StartIndexLocation = 0;INT BaseVertexLocation = 0;// Bounding box of the geometry defined by this submesh. / This is used in later chapters of the book.DirectX::BoundingBox Bounds;
};struct MeshGeometry
{// Give it a name so we can look it up by name.std::string Name;// System memory copies. Use Blobs because the vertex/index format can // be generic.// It is up to the client to cast appropriately. 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;// Data about the buffers.UINT VertexByteStride = 0;UINT VertexBufferByteSize = 0;DXGI_FORMAT IndexFormat = DXGI_FORMAT_R16_UINT;UINT IndexBufferByteSize = 0;// A MeshGeometry may store multiple geometries in one vertex/index // buffer.// Use this container to define the Submesh geometries so we can draw// the Submeshes individually.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;}// We can free this memory after we finish upload to the GPU.void DisposeUploaders(){VertexBufferUploader = nullptr;IndexBufferUploader = nullptr;}
};

最后,我们已经介绍了足够的技术点来呈现一个简单的演示,它会生成一个彩色的盒子。 这个例子基本上将我们在前面博客讨论过的所有内容都放到了一个程序中。 读者应该研究代码并参考前面的部分,需要大家理解每一行。 请注意,该程序使用的Shader所在目录是Shaders \ color.hlsl:
这里写图片描述

链接:https://pan.baidu.com/s/1X0Vikf6qGYGPKU-Nwf-wYA 密码:h79q

小结

1、Direct3D中的顶点可以包含除空间位置之外的其他数据, 要创建自定义顶点格式,我们首先定义一个包含我们选择的顶点数据的结构, 一旦我们定义了顶点结构,通过定义输入布局描述(D3D12_INPUT_LAYOUT_DESC)将其描述为Direct3D,该描述是D3D12_INPUT_ELEMENT_DESC元素的数组,以及数组中元素的数量。 D3D12_INPUT_ELEMENT_DESC数组中的每个元素描述并对应顶点结构中的一个组件。 输入布局描述被设置为D3D12_GRAPHICS_PIPELINE_STATE_DESC结构中的字段,其中它成为PSO的一部分,并根据顶点着色器输入签名进行验证。 当PSO是绑定的一部分时,输入布局绑定到IA阶段。
2、为了使GPU能够访问顶点/索引数组,需要将它们放在称为缓冲区的资源中,该资源由ID3D12Resource接口表示。 存储顶点的缓冲区称为顶点缓冲区,存储索引的缓冲区称为索引缓冲区。 通过填写D3D12_RESOURCE_DESC结构然后调用ID3D12Device :: CreateCommittedResource方法来创建缓冲区资源。 顶点缓冲区的视图由D3D12_VERTEX_BUFFER_VIEW结构表示,索引缓冲区的视图由D3D12_INDEX_BUFFER_VIEW结构表示。 顶点缓冲区使用ID3D12GraphicsCommandList :: IASetVertexBuffers方法绑定到IA阶段,索引缓冲区使用ID3D12GraphicsCommandList :: IASetIndexBuffer方法绑定到IA阶段。 可以使用ID3D12GraphicsCommandList :: DrawInstanced绘制非索引几何体,并且可以使用ID3D12GraphicsCommandList :: DrawIndexedInstanced绘制索引几何体。
3、顶点着色器是用HLSL编写的程序,在GPU上执行,输入顶点并输出顶点, 每个绘制的顶点都通过顶点着色器。 这使程序员能够在每个顶点的基础上进行专门的工作,以实现各种渲染效果, 从顶点着色器输出的值将传递到管道中的下一个阶段。
4、常量缓冲区是GPU资源(ID3D12Resource),其数据内容可以在着色器程序中引用。 它们是在上传堆而不是默认堆中创建的,因此应用程序可以通过将系统内存复制到GPU内存来更新常量缓冲区数据。 通过这种方式,C ++应用程序可以与着色器通信并更新着色器使用的常量缓冲区中的值; 例如,C ++应用程序可以更改着色器使用的世界视图投影矩阵。 一般建议是根据需要更新其内容的频率创建常量缓冲区。 将常数缓冲区分开的动机是效率。 更新常量缓冲区时,必须更新其所有变量; 因此,基于其更新频率对它们进行分组以最小化冗余更新是有效的。
5、像素着色器是在HLSL中编写的程序,在GPU上执行,其输入内插顶点数据并输出颜色值。 作为硬件优化,在将像素片段设置到像素着色器之前,可能会使管道拒绝像素片段。 像素着色器使程序员能够基于每个像素进行专门的工作,以实现各种渲染效果, 像素着色器输出的值将传递到管道中的下一个阶段。
6、控制图形管道状态的大多数Direct3D对象被指定称为管道状态对象(PSO)的聚合,它由ID3D12PipelineState接口表示。 我们将所有这些对象指定为图形管道的聚合以提高性能, 通过将它们指定为聚合,Direct3D可以验证所有状态是否兼容,并且驱动程序可以预先生成所有代码以编程硬件状态。

这篇关于D3D12渲染技术之几何辅助结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/jxw167/article/details/82697626
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/189517

相关文章

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径