DirectX 11 - 为什么常量缓冲区 D3D11_USAGE_DYNAMIC 由 CPU 而不是 GPU 更新?

问题描述 投票:0回答:1

因此,我试图围绕D3D11常量缓冲区进行思考,我目前的理解是,常量缓冲区用于存储在整个绘制调用中保持不变的数据,但在创建绘制调用之间可能会发生变化恒定缓冲区,我这样做:

D3D11_BUFFER_DESC constant_buffer_description;
constant_buffer_description.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constant_buffer_description.Usage = D3D11_USAGE_DYNAMIC;    
                                                            
constant_buffer_description.CPUAccessFlags = 0u;            
constant_buffer_description.MiscFlags = 0u;                 
constant_buffer_description.ByteWidth = sizeof( const_buffer );
constant_buffer_description.StructureByteStride = 0u;       
D3D11_SUBRESOURCE_DATA constant_buffer_subresource_data = {};
constant_buffer_subresource_data.pSysMem = &const_buffer;

后来我发现需要将CPUAccessFlags设置为D3D11_CPU_ACCESS_WRITE,以便CPU可以写入该缓冲区。

现在,如果您查看 D3D11_USAGE_DYNAMIC 的描述,它指出:

GPU(只读)和CPU都可以访问的资源 (只写)。对于以下资源来说,动态资源是一个不错的选择 CPU 每帧至少更新一次

但是这里我们主要处理的是硬件加速的东西,为什么资源由CPU更新并由GPU读取?由于 GPU 专门从事此类工作,因此在 GPU 中读取并更新它不是更快吗?

比如,为什么在着色器本身内部使用 const 缓冲区而不是结构化缓冲区?

c++ windows shader directx directx-11
1个回答
0
投票

我目前的理解是,常量缓冲区用于存储在整个绘制调用中保持不变但可能在绘制调用之间发生变化的数据

是的,这是正确的,在绘制调用开始时,GPU 将缓存常量缓冲区的全部内容以在着色器中使用。缓存是它“保持不变”的原因。这是因为着色器从该缓存中读取而不是从缓冲存储器本身读取。绘制期间对缓冲区的任何更改都不会影响着色器从中读取的缓存。

为什么资源由CPU更新,由GPU读取?由于 GPU 专门从事此类工作,因此在 GPU 中读取并更新它不是更快吗?

如果我正确理解你的问题,你是在问为什么缓冲区的内存被映射到CPU(CPU用C++中的

memcpy
之类的东西更新它),而不是相反。

因为D3D11中没有API可以让GPU主动从CPU RAM读取数据,所以将数据传递给GPU始终是CPU的工作。

如果您确实正在寻找允许 GPU 直接从 CPU RAM(甚至从硬盘驱动器)读取数据的方法,您应该在 DirectX 12 Ultimate 中寻找 DirectStorage。

比如,为什么在着色器本身内部使用 const 缓冲区而不是结构化缓冲区?

如果我正确理解你的问题,你是在问使用常量缓冲区和结构化缓冲区之间有什么区别。

正如我之前所说,在每次绘制调用开始时都会缓存一个常量缓冲区。根据我的理解,着色器在运行之前会读取缓冲区的整个内容(可能到堆栈上),因此它在运行时享有最佳的读取速度。因此,最好将它用于每个着色器实例都使用此缓冲区中数据的“most-if-not-all”和“overlapping-if-not-identical部分”的场景,并且该缓冲区不是很大,因此它不会溢出堆栈。 相机缓冲区适合这种情况,它用于每个顶点的计算,也可能用于像素着色器中的每个像素。 而结构化缓冲区,根据我的理解,不会提前缓存,在运行之前不会被着色器读取,因此不会增加堆栈大小。最好在每个顶点/像素将访问数据的“不同部分”并且数据可能非常大的情况下使用它。就像纹理或骨骼矩阵缓冲区一样。但这并不一定意味着结构化缓冲区“不是恒定的”,StructuredBuffer不提供写访问。如果您正在寻找“GPU 写入”到结构化缓冲区中,则需要

RWStructuredBuffer

,在其中将无序访问视图(而不是着色器资源视图)绑定到它。


© www.soinside.com 2019 - 2024. All rights reserved.