directx - 如何使用实例偏移

标签 directx directx-11

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

最佳答案

偏移量

这些偏移量独立工作。您可以在 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
    

我更喜欢在绘图调用中进行偏移:

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

替代解决方案

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

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

希望对你有帮助!

关于directx - 如何使用实例偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20794017/

相关文章:

c# - 以 Win8.1 + Metro 为目标时使用 SharpDX 保存 Texture2D?

c - 加载图片 directx 12 oculus 裂痕

c++ - 16字节对齐问题

c++ - 将 SpriteBatch 与 Direct3D 和 XAML 结合使用

c# - 在 C# 中,显示可缩放和平移视频的好方法是什么?

c++ - DirectX 11 对象通过旋转闪烁

c++ - 如何将 XMMATRIX 和 XMVECTOR (DirectX11) 相乘?

c++ - directX 11 比例纹理 2D

c++ - MiscFlags D3D11_RESOURCE_MISC_GDI_COMPATIBLE 用于 GDI 兼容纹理,但 IDXGISurface1::GetDC 抛出异常

graphics - nVidia SLI 技巧