DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS-程序员宅基地

技术标签: Dx11读书笔记  index  索引  索引缓存  directx11  


创建 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: 这个数值在利用索引查找顶点之前会与索引值相加, 相当于一个整体的偏移.

buffer 合并

  考虑上图中情况, 我们首先由三组不同的 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);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010333737/article/details/78682415

智能推荐

移动光猫:家庭存储_光猫ftp存储怎么设置-程序员宅基地

背景:最近家里更换宽带,新装移动宽带,送的光猫名称为吉比特无源光纤接入用户端设备具体的型号没有留意,发现上面有U口,有的人认为是调试升级用的,本人不以为然。个人思路:本人认为u口可用于下载外接设备或者共享打印机之类的,后在百度中进行搜索,发现帖子数量屈指可数,唯独只有一篇文章大致介绍了功能与结果,实现的方法没有呈现出来,后自己探索研究,找到共享设置的方法。本文技术概要:实现过程很简单,只需要插上U盘,进入FTP地址即可,写本文纯属是闲的没事干!(其实更多的是为了那些想百度,想学习,想探索更多,却_光猫ftp存储怎么设置

springboot+es_es查询结果拼在一起-程序员宅基地

springboot-es本文 :Elasticsearch 与 sprigboot 的结合,springboot 操作es关于es 的介绍和初识 可以看 https://blog.csdn.net/u012373815/article/details/50460248安装https://blog.csdn.net/u012373815/article/details/50463792..._es查询结果拼在一起

数字签名是什么-程序员宅基地

数字签名是什么?作者: 阮一峰今天,我读到一篇好文章。它用图片通俗易懂地解释了,"数字签名"(digital signature)和"数字证书"(digital certificate)到底是什么。我对这些问题的理解,一直是模模糊糊的,很多细节搞不清楚。读完这篇文章后,发现思路一下子就理清了。为了加深记忆,我把文字和图片都翻译出来了。文中涉及的密码学基本知识

Linux篇 二、香橙派Zero2获取Linux SDK源码_香橙派linux_追逐内啡肽,拒绝多巴胺的博客-程序员宅基地

我可以编译orangepi-build 18.04的镜像主要是改git的代理,或者先把github先搞到码云上,在用码云的链接理论上也是可以的。_香橙派linux

idea 部署web项目到tomcat之后,修改html,js等文件浏览器无法生效或者不能及时生效_star_zhang_jx的博客-程序员宅基地

idea部署的web项目在tomcat服务器上不能及时生效 步骤一: 修改tomcat配置,如下: on ‘update‘ action:当用户主动执行更新的时候更新    快捷键:Ctrl + F9 on frame deactication:在编辑窗口失去焦点的时候更新 这样就完成了热部署 步骤二: 完成上面的操作,很大一部分发现html的修改能够及时更新了,但是js或者jsp的修改却一直没有更新,这是为什么呢? 答案是:浏览器的坑 我是使用的chrome,F12到调试窗口 .

简易的http客户端附源代码_htttp客户端源码 单片机-程序员宅基地

导读:   通过输入网址获取返回的源码,没有去掉http协议头信息。   用的URI解析域名及Socket连接服务器,可自定义一次返回多少k的信息。直到返回完毕为止。可作为网络爬虫的简单引擎。   源码地址:http://www.foryears.com/HttpClient.rar   图片如下:         此主题相关图片如下:            核心代码:   import _htttp客户端源码 单片机

随便推点

C语言循环语句例题与应用-程序员宅基地

为C语言的初学者提供的例题与应用

32岁的亨利就坐在那里,深情的目光望过去,都是自己22岁的影子_32岁的亨利就坐在那里深情的目光望过去-程序员宅基地

当时光的列车缓缓驶过酋长球场,32岁的亨利就坐在那里,深情的目光望过去,都是自己22岁的影子。还是那辆列车,随着时光送走了匆匆过客,静静开往另一片大陆,33岁的亨利就坐在那里,深情的目光望过去,依稀浮现的是自己25岁的模样。远方的期许固然美好,而列车短暂的停留,更好像岁月的美丽回眸,当时光奏出回家的天籁,35岁的亨利就在那里,深情的目光望去,勾勒出自己29岁的动人画面。渐行渐远的车..._32岁的亨利就坐在那里深情的目光望过去

字符集编码研究-程序员宅基地

作者: pegasus8271. 概述本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687"。注意,这两个字没有iso8859-1编码,但可以用iso8859-1编

s3c2440 usb host device controller驱动分析(六)-----usb device 和 usb interface_usb device and usb interface-程序员宅基地

前面分析了usb hub 和 generic driver,顺便将枚举的前一部分看完了。本来我们应该继续分析class driver的最上层,即利用usb通信实现具体功能的驱动。我们将以usb-skeleton.c为例。但在分析usb-skeleton之前,我们注意到最上层的驱动都是针对usb interface的,usb driver里面的函数都用usb interface做参数,usb dri_usb device and usb interface

ruby环境搭建-程序员宅基地

一、介绍Ruby 是一种开源的面向对象程序设计的服务器端脚本语言。二、安装键入以下命令yum install rubyyum install rubygems安装ruby和redis的接口程序https://rubygems.org/gems/redis/versions/4.0.1 下载,4.0.1版本 拷贝redis-4.0.1.gem至/usr/local下,解压gem install /