原文:DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010333737/article/details/78682415


创建 index buffer

  和顶点一样, 索引也需要被GPU读取处理, 他也存放在一个专门的结构中, 这个结构就是 index buffer. index buffer 与 vertex buffer 很相似, 只有存储的数据不同, 创建 index buffer 的过程也和创建 vertex buffer 接近.

  接下来直接给出代码, 有问题的部分可以去前文 Direct3D渲染2–VERTEX BUFFER 寻找说明.

UINT indices[24] = {
0, 1, 2, // Triangle 0
0, 2, 3, // Triangle 1
0, 3, 4, // Triangle 2
0, 4, 5, // Triangle 3
0, 5, 6, // Triangle 4
0, 6, 7, // Triangle 5
0, 7, 8, // Triangle 6
0, 8, 1 // Triangle 7
};
// Describe the index buffer we are going to create.
// Observe the D3D11_BIND_INDEX_BUFFER bind flag
D3D11_BUFFER_DESC ibd;
ibd.Usage = D3D11_USAGE_IMMUTABLE;
ibd.ByteWidth = sizeof(UINT) * 24;
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER ;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
ibd.StructureByteStride = 0; // Specify the data to iInitDatathe index buffer.
D3D11_SUBRESOURCE_DATA iInitData;
iInitData.pSysMem = indices; // Create the index buffer.
ID3D11Buffer* mIB;
HR(md3dDevice->CreateBuffer(&ibd, &iInitData, &mIB));

绑定 index buffer

  与 vertex buffer 相同, 我需要绑定之后才能使用 index buffer.

// Bind index buffer to pipeline.
md3dImmediateContext->IASetIndexBuffer(mIB, DXGI_FORMAT_R32_UINT, 0);

  IASetIndexBuffer 的第二个参数来表示索引的数据类型, 我们使用32位无符号整型来表示索引, 所以是 DXGI_FORMAT_R32_UINT, 在 index buffer 中只有 DXGI_FORMAT_R32_UINTDXGI_FORMAT_R16_UINT 是被接受的参数, 使用时需要注意要与 D3D11_BUFFER_DESC::ByteWidth 的值对应. 第三个参数表示偏移, 指明第一个索引的位置.


用 index buffer 渲染顶点

  在讲解 vertex buffer 的时候我们使用 ID3D11DeviceContext::Draw 方法来渲染顶点, 但是如果想要用 index buffer 来渲染顶点, 我们需要使用 ID3D11DeviceContext::DrawIndexed 方法来渲染.

void ID3D11DeviceContext::DrawIndexed(
UINT IndexCount,
UINT StartIndexLocation,
INT BaseVertexLocation);
  1. IndexCount: 在这次 drawcall 中需要使用的顶点的数量, 他不必是 index buffer 中的所有顶点.
  2. StartIndexLocation: 这次 drawcall 中要渲染的第一个顶点的索引的位置.
  3. BaseVertexLocation: 这个数值在利用索引查找顶点之前会与索引值相加, 相当于一个整体的偏移.

  考虑上图中情况, 我们首先由三组不同的 VB 和 IB, 分别表示 sphere, box 和 cylinder. 现在我们把三个 VB 整合到同一个 VB 中, 对 IB 也做相同的操作. 这样原先的索引就不正确了, 为了纠正这种合并 buffer 导致的错误, DrawIndexed 的后两个参数就有了用武之地, 有了这两个参数就可以修正合并导致的偏移 ( 关于合并 buffer, 有一些 API 在切换 VB 和 IB 的时候会有一些开销, 虽然这不一定会成为性能瓶颈, 但是在合并很容易的时候, 这总是值得的 ).

  渲染这三个几何体的方法就是这样:

md3dImmediateContext->DrawIndexed(numSphereIndices, 0, 0);
md3dImmediateContext->DrawIndexed(numBoxIndices, firstBoxIndex, firstBoxVertexPos);
md3dImmediateContext->DrawIndexed(numCylIndices, firstCylIndex, firstCylVertexPos);

DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS的更多相关文章

  1. DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES

    原文:DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010 ...

  2. DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER

    原文:DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u01033 ...

  3. DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS

    原文:DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0 ...

  4. DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER

    原文:DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...

  5. DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER

    原文:DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...

  6. DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS

    原文:DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.c ...

  7. DirectX11笔记(三)--Direct3D初始化2

    原文:DirectX11笔记(三)--Direct3D初始化2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article/ ...

  8. DirectX11笔记(二)--Direct3D初始化1之基本概念

    原文:DirectX11笔记(二)--Direct3D初始化1之基本概念 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/art ...

  9. DirectX11笔记(三)--Direct3D初始化代码

    原文:DirectX11笔记(三)--Direct3D初始化代码 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article ...

随机推荐

  1. [转]Visual Studio 2010单元测试(1)--运行和定义普通单元测试

    Visual Studio 2010 运行和定义单元测试 在VS2010中,单元测试的功能很强大,使得建立单元测试和编写单元测试代码,以及管理和运行单元测试都变得简单起来,通过私有访问器可以对私有方法 ...

  2. 利用animate.css和es6制作文字向上滚动的效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel= ...

  3. SSH协议的Python实现paramiko

    目录 paramiko安装 SSHClient类与SFTPClient类 SSHClient类的方法 SFTPClient类的方法 paramiko的基本使用 paramiko.SSHClient两种 ...

  4. get请求中文乱码

    get请求时要将url进行encodeURI http://www.ruanyifeng.com/blog/2010/02/url_encoding.html http://www.ruanyifen ...

  5. Linux 命令之head, tail, tr, sort, uniq, grep

    head [filename] head -n 11 [filename] -> First 11 lines head -c 20 [filename] -> First 20 char ...

  6. 注册.NET Framework

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe /i

  7. c#日期时间截取

    时间格式化CodeDateTime dt = DateTime.Now;Label11.Text = dt.ToString();2005-11-5 13:21:25Label12.Text = dt ...

  8. pytorch 多GPU处理过程

    多GPU的处理机制: 使用多GPU时,pytorch的处理逻辑是: 1.在各个GPU上初始化模型. 2.前向传播时,把batch分配到各个GPU上进行计算. 3.得到的输出在主GPU上进行汇总,计算l ...

  9. T2483 电梯(模拟题)

    https://www.luogu.org/problem/show?pid=T2483 题目背景 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道. ...

  10. C++ 静态绑定与动态绑定------绝不重新定义继承而来的缺省参数

    在了解静态绑定和动态绑定之前,先了解什么是对象的静态类型,什么是对象的动态类型. 对象的静态类型:对象在声明时采用的类型.是在编译器决定的. 对象的动态类型:目前所指对象的类型.是在运行期决定的. 动 ...