本文共 1512 字,大约阅读时间需要 5 分钟。
顶点缓存有什么作用?
顶点缓存用于储存网格模型的所有顶点数据。当我们在Direct3D中创建一块顶点缓存时,我们是在创建一个内存的最优位置上的对象,该最优位置例如是图形硬件的显存,它由硬件的设备驱动所选择。当Direct3D渲染我们的对象时,它通过图形总线来变换这些缓存信息,通过渲染管线执行必要的操作来最终决定几何图形是否被渲染在屏幕上。这里说的“不”是由于几何图形最终被Direct3D 判定为不可见的。尝试渲染大量的不可见的几何图形会导致性能下降,大多数的高级的3D 商业视频游戏使用一种技术,该技术决定是否几何图形预先可见,并且只提交那些可见或者潜在可见的图形给图形硬件处理。这是一个高级主题,它属于场景管理部分并且处理多个次主题比如裁剪和划分算法。
如何创建顶点缓存?
首先我们要用一个数组来保存顶点的信息。如示例:
VertexPos vertices[] = { XMFLOAT3( 0.5f, 0.5f, 0.5f ), XMFLOAT3( 0.5f, -0.5f, 0.5f ), XMFLOAT3( -0.5f, -0.5f, 0.5f ) };利用设备的CreateBuffer函数来创建顶点缓存。
第一个参数是设备描述对象,用于描述顶点缓存。 第二个参数是子资源数据,该结构的pSysMem成员是一个已经初始化内存的指针,在现在这种情况是我们发送给缓存填充的内存,也就是上面的顶点数组。 第三个参数保存创建的缓存对象指针。
顶点缓存如何描述?
缓存描述主要用到如下成员:
- Usage,缓存用法。这里我们用D3D11_USAGE_DEFAULT。
- BindFlags,绑定标识,这里我们用顶点缓存绑定标识:D3D11_BIND_VERTEX_BUFFER
- ByteWidth,缓存的字节宽度,这里可以用sizeof(vertices)。
子资源数据如何创建?
这里我们可以简单地将D3D11_SUBRESOURCE_DATA结构体对象的pSysMem传进vertices顶点数组即可。
下面是一个创建三角顶点缓存示例:
VertexPos vertices[] = { XMFLOAT3( 0.5f, 0.5f, 0.5f ), XMFLOAT3( 0.5f, -0.5f, 0.5f ), XMFLOAT3( -0.5f, -0.5f, 0.5f ) }; D3D11_BUFFER_DESC vertexDesc; ZeroMemory( &vertexDesc, sizeof( vertexDesc ) ); vertexDesc.Usage = D3D11_USAGE_DEFAULT; vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; vertexDesc.ByteWidth = sizeof( VertexPos ) * 3; D3D11_SUBRESOURCE_DATA resourceData; ZeroMemory( &resourceData, sizeof( resourceData ) ); resourceData.pSysMem = vertices; ID3D11Buffer* vertexBuffer; HRESULT result = d3dDevice_->CreateBuffer( &vertexDesc, &resourceData,&vertexBuffer );
转载地址:http://zjyii.baihongyu.com/