介绍Direct3D 11中的缓冲区(十六)

缓冲区资源是一组按元素分组的全类型数据的集合。你可以使用缓冲区来存储各种各样的数据,包括位置信息,法向量,纹理坐标、索引信息、设备状态。一个元素由1到4个组件组成。缓冲区元素包含打包数据值(R8G8B8A8),单个8位整数,或4个32位浮点值。

缓冲区作为非结构化资源创建,缓冲区不能包含任何mipmap级别,它在读取时不能被过滤,也不能被多采样。

缓冲区类型

下面是D3D11缓冲区资源类型,所有缓冲区类型都由ID3D11Buffer接口封装。

  • 顶点缓冲区
  • 索引缓冲区
  • 常量缓冲区

顶点缓冲区

顶点缓冲区包含用于定义几何体顶点数据。顶点数据包含位置坐标,颜色数据,纹理坐标,法向量数据等。最简单的顶点缓冲区只包含顶点位置信息。它可以像下图一样可视化。

顶点缓冲区通常都包含完整的3D顶点需要的数据,例如:一个顶点缓冲区包含一个位置信息,法向量,纹理坐标。这个数据通常组成一个数据元素的集合,如下图所示:

这个顶点缓冲区包含每个顶点数据;每个顶点包含3个元素(顶点位置,法向量,纹理坐标),顶点坐标和法向量通常用DXGI_FORMAT_R32G32B32_FLOAT格式指定,而纹理坐标通常用DXGI_FORMAT_R32G32_FLOAT格式指定。

访问顶点缓冲区中的数据你需要知道要访问哪个顶点。加上以下额外的缓冲区参数:

  • 偏移量——从缓冲区开始到第一个顶点的数据的字节数。可以使用ID3D11DeviceContext::IASetVertexBuffers方法指定偏移量。
  • BaseVertexLocation——从偏移量到适当的draw调用使用的第一个顶点的字节数。

在创建顶点缓冲区之前,需要通过创建ID3D11InputLayout接口来定义它的布局;这是通过调用ID3D11Device::CreateInputLayout方法实现。创建input-layout对象后,可以通过调用ID3D11DeviceContext::IASetInputLayout将其绑定到input-assembler阶段。要创建顶点缓冲区,请调用ID3D11Device::CreateBuffer。

索引缓冲区

索引缓冲区包含顶点缓冲区中的整数偏移量,用于更有效地呈现图元。索引缓冲区包含一系列16位或32位索引。每个索引用于标识顶点缓冲区中的一个顶点。可以将索引缓冲区可视化,如下图所示。

存储在索引缓冲区中的顺序索引使用以下参数进行定位:

  • 从缓冲区开始到第一个索引的字节数。偏移量提供给ID3D11DeviceContext::IASetIndexBuffer方法。
  • StartIndexLocation—从偏移量到适当的draw调用使用的第一个顶点的字节数。
  • IndexCount——要呈现的索引数

要创建索引缓冲区,请调用ID3D11Device::CreateBuffer。

常量缓冲区

常量缓冲区允许您有效地向管道提供着色器常量数据。您可以使用一个常量缓冲区来存储流输出阶段的结果。从概念上讲,常量缓冲区看起来就像一个单元素顶点缓冲区,如下图所示。

每个元素存储一个1到4个的组件常量,由所存储数据的格式决定。创建一个着色器常量缓冲区,调用ID3D11Device::CreateBuffer并指定D3D11_BIND_FLAG枚举类型的D3D11_BIND_CONSTANT_BUFFER成员。

一个常量缓冲区只能使用一个绑定标志(D3D11_BIND_CONSTANT_BUFFER),不能与任何其他绑定标志组合。要将着色器常量缓冲区绑定到管道,请调用以下方法之一

ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::PSSetConstantBuffers,或ID3D11DeviceContext::VSSetConstantBuffers。

要从着色器读取着色器常量缓冲区,请使用load HLSL固有函数。每个着色器阶段允许多达15 s的序常数缓冲区;每个缓冲区最多可以容纳4096个常量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值