如何使用实例化偏移量

时间:2013-12-27 02:43:09

标签: directx directx-11

假设我有2个不同实例组的实例数据的单个缓冲区(即,我想在单独的绘制调用中绘制它们,因为它们使用不同的纹理)。如何设置偏移量来完成此操作? IASetVertexBuffersDrawIndexedInstanced都有偏移参数,我不清楚需要使用哪些参数。此外,如果偏移值是以字节为单位,DrawIndexedInstanced并不完全清楚。

1 个答案:

答案 0 :(得分:2)

偏移

这些偏移独立。您可以在ID3D11DeviceContext::IASetVertexBuffersID3D11DeviceContext::DrawIndexedInstanced或两者中进行偏移(然后它们将合并)。

  • ID3D11DeviceContext::IASetVertexBuffers接受以字节为单位的偏移

     bindedData = (uint8_t*)data + sizeof(uint8_t) * offset
    
  • ID3D11DeviceContext::DrawIndexedInstanced接受元素(索引,顶点,实例)中的所有偏移。它们只是添加到指数的值。顶点和实例偏移独立工作。索引偏移也会偏移顶点和实例(显然):

     index = indexBuffer[i] + StartIndexLocation
     indexVert = index + BaseVertexLocation
     indexInst = index + StartInstanceLocation
    

我更喜欢在绘制调用中进行抵消:

  • 不需要字节(指针)算术 - 错误的机会更少
  • 如果只改变偏移量,则无需重新绑定缓冲区 - 更少可见的状态更改(并且希望也是不可见的)

替代解决方案

您可以合并纹理资源并在一次绘制调用中绘制所有内容,而不是将渲染分割为两个绘制调用:

  • 两个纹理在相同的绘制调用中绑定,在着色器中分支(if / else),取决于通过常量缓冲区传递的整数(最简单的解决方案)
  • texture array(如果目标硬件支持)
  • 纹理图集(需要一些编码,但总是很有用)

希望它有所帮助!