Practical Rendering and Computation with Direct3D 11
+ -

2.2.1缓冲区资源-顶点缓冲区

2024-06-14 16 0

2.1资源解析

既然我们已经了解了资源和资源视图的一些基本原理,现在是时候开始对各种类型的资源进行更详细的检查了,看看是什么使它们彼此不同,以及它们可以做什么。本节将介绍每种类型的资源,并讨论它们可以用来创建的每种可用子类型。我们从缓冲区资源开始,探索可以使用的每种缓冲区类型及其各种属性。接下来是关于纹理资源的一般性讨论,然后是关于每个纹理类型可用的各种配置和选项的类似详细讨论。同样重要的是要了解我们正在使用的资源的双重性质。它们在C/C++中以高级别创建、发布并连接到管道,但也在可编程着色器阶段的HLSL着色器程序中以更精细的粒度级别使用。这两种使用模式当然是相互交织的,因为HLSL中的某些操作需要某些资源类型。在本章中,我们将探讨资源的两面性。在本节中,我们还将探讨资源使用等式的两面性。

2.2.1缓冲区资源

缓冲资源类型提供了供Direct3D 11使用的一维线性存储器块。可以使用许多不同的配置来更改缓冲区的行为,但它们都共享相同的基本线性布局。图2.7显示了缓冲区资源是如何组织的

缓冲区资源

如图2.7所示,缓冲区的大小以字节为单位。根据缓冲区的类型以及每个特定缓冲区类型的一些特定配置,组成缓冲区的元素可以具有不同的大小。根据缓冲区资源的布局,将将元素数量乘以每个元素的大小就是给出缓冲区的总大小。这种简单的类似阵列的布局结构提供了令人惊讶的多种可用缓冲区类型。某些缓冲区类型将主要用于应用程序的C++端,而其他缓冲区类型在附加到管道后将主要由HLSL着色器程序使用。本节将探讨每种不同类型的缓冲区,描述它们提供的功能,并演示如何创建它们。此外,我们将讨论缓冲区的常见用法,并提供基本的HLSL语法来声明和使用着色器程序中的这些资源。

一些缓冲区用于C++端,另一些附加到管道后用于着色器端。

顶点缓冲区

我们将研究的第一种缓冲区类型是顶点缓冲区。顶点缓冲区的用途是容纳所有数据,这些数据最终将被组装成顶点并通过渲染管道发送。最简单的顶点缓冲区配置是顶点结构的阵列,其中每个顶点都包含位置、法向量和纹理坐标等元素。这些顶点元素必须符合可用的格式和类型规范。然而,顶点内所需的任何通用信息也可以打包到顶点结构中,以允许特定渲染算法的自定义输入数据。

顶点缓冲区

除了上面描述的简单阵列样式的顶点缓冲区之外,这些缓冲区还允许一些其他更复杂的配置。例如,可以同时使用多个顶点缓冲区。这允许在多个缓冲区之间分割顶点数据。例如,顶点位置可以存储在一个缓冲区中,顶点法向量可以存储在另一个缓冲区时。这允许应用程序根据需要选择性地添加顶点数据,而不是为所有渲染场景使用一个大的整体缓冲区。此技术可用于减少渲染操作所需的带宽量,也可以执行实例化渲染,其中一个或多个顶点缓冲区提供模型的逐顶点数据,而额外的顶点缓冲区则提供逐实例数据而不是逐顶点数据。然后,将第一缓冲区中定义的模型渲染为一系列模型,将来自第二缓冲区的每个实例的数据应用于每个实例。图2.8描述了这些不同的顶点提交配置。每个实例的数据可以包括世界变换、颜色变化或用于区分模型的各个实例的任何其他数据。此设置允许使用单个绘制调用来渲染许多对象,从而减少了渲染操作的总体CPU开销。

您可以在图中看到,每种类型的顶点缓冲区都遵循我们的通用缓冲区布局。每个缓冲区都是大小相同的元素的一维数组。单个数据元素的大小总是与同一缓冲区中的其他元素的大小相同,尽管如果使用多个缓冲区,它们可以具有不同的元素大小。我们将在第3章中更详细地了解实例化渲染是如何执行的。

  • 顶点缓冲区使用:顶点缓冲区的主要目的是直接在多个缓冲区配置中或通过实例化向管道提供顶点信息。为此,将顶点缓冲区绑定到管道的主要位置是输入装配程序阶段,它充当管道的入口点。除了输入装配程序阶段,顶点缓冲区也可以附加到流输出阶段,以允许渲染管道将顶点数据流式传输到缓冲区中,从而数据可以在随后的渲染过程中使用。管道的这两个阶段将在第3章“渲染管道”中进行更详细的讨论
  • 创建顶点缓冲区。于资源可以绑定到的管道中的每种类型的位置,都有一个相应的绑定标志,必须在资源创建时设置该标志,以便将资源绑定到那里。考虑到这一点,顶点缓冲区必须始终设置D3D11_BIND_VERTEX_BUFFER 绑定标志。也可以选择增加D3D11_BIND_STREAM_OUTPUT绑定标志将用于将顶点数据流式传输出管道

只绑定到输入装配阶段使用标识:D3D11_BIND_VERTEX_BUFFER 。如果用于用于顶点数据流式传输出管道,使用D3D11_BIND_VERTEX_BUFFER|D3D11_BIND_STREAM_OUTPUT。

除了选择绑定标志之外,顶点缓冲区的另一个主要考虑因素是缓冲区将要经历的使用场景。取决于顶点缓冲区的内容是否会频繁更改,以及这些更改是否来自CPU或GPU,将需要不同的使用标志。例如,如果将加载到缓冲区的数据是静态的,则应使用D3D11_USAGE_IMMUTABLE使用标志创建缓冲区资源。在这种情况下,当创建缓冲区时,它将通过传递给创建方法的D3D11_SUBRES0URCE_DATA参数用顶点数据进行初始化,并且永远不会被再次修改。这种类型的顶点缓冲区的示例将用于保存静态地形网格的内容。
160815568876
但是,如果CPU频繁更新缓冲区,则应使用D3D11_USAGE_DYNAMIC创建缓冲区,并使用CPU访问标志参数的CPU写入标志创建缓冲区。这种类型的顶点缓冲区使用的一个例子是在CPU上而不是在GPU上执行顶点变换。然后,这些更新将在每帧被复制到缓冲区资源中。这是一种常见的技术,用于通过将所有模型数据放入同一参考系(通常是世界空间或视图空间)来将许多绘制调用压缩为一个调用。还有第三种使用类型是创建缓冲区,该缓冲区将由具有流输出功能的GPU更新。在这种情况下,将使用D3D11_USAGE_DEFAULT使用标志。清单2.6中提供了一个示例缓冲区创建过程来演示这些选项。


ID3DllDevice* g_pDevice = 0;
ID3DllBuffer* CreateVertexBuffer( UINT size,bool dynamic,bool streamout,D3D11_SUBRES0URCE_DATA* pData)
{
    D3D11_BUFFER_DESC desc;
    desc.ByteWidth = size;
    desc.MiscFlags = 0;
    desc.StructureByteStride = 0;

    // Select the appropriate binding locations based on the passed in flags
    //是否用于顶点输出流管道
    if ( streamout )
    desc.BindFlags = D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_STREAM_0UTPUT;
    else
    desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;

    // Select the appropriate usage and CPU access flags based on the passed in flags
    if ( dynamic )
    {
        desc.Usage = D3D11_USAGE_DYNAMIC;
        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    }
    else
    {
        desc.Usage = D3D11_USAGE_IMMUTABLE;
        desc.CPUAccessFlags = 0;
    }
    // Create the buffer with the specified configuration
    ID3D11Buffer* pBuffer = 0;
    HRESULT hr = g_pDevice->CreateBuffer( &desc, pData, &pBuffer );
    if ( FAILED( hr ) )
    {
        // Handle the error here...
        return( 0 );
    }
    return( pBuffer );
}

从这个列表中,我们可以看到缓冲区描述是如何针对不同的使用场景进行不同配置的。在这两种情况下,缓冲区元素的大小和缓冲区的总体大小保持不变,而绑定标志、使用标志和CPU访问标志都有所不同,这取决于缓冲区的预期用途。我们将在其他缓冲区类型的每个缓冲区描述规范中看到类似的模式.

资源视图要求:顶点缓冲区直接绑定到输入装配级或流输出级。因此,在使用资源视图时无需创建资源视图。

顶点缓冲区无需创建资源视图。

0 篇笔记 写笔记

2.2.1缓冲区资源-顶点缓冲区
2.1资源解析既然我们已经了解了资源和资源视图的一些基本原理,现在是时候开始对各种类型的资源进行更详细的检查了,看看是什么使它们彼此不同,以及它们可以做什么。本节将介绍每种类型的资源,并讨论它们可以用来创建的每种可用子类型。我们从缓冲区资源开始,探索可以使用的每种缓冲区类型及其各种属性。接下来是关于......
作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!