假设我有一个用于 2 个不同实例组的实例数据缓冲区(即,我想在单独的绘制调用中绘制它们,因为它们使用不同的纹理)。如何设置偏移量来实现此目的? IASetVertexBuffers
和 DrawIndexedInstanced
都有偏移参数,我不清楚需要使用哪些参数。此外,DrawIndexedInstanced
并不完全清楚偏移值是否以字节为单位。
最佳答案
偏移量
这些偏移量独立工作。您可以在 ID3D11DeviceContext::IASetVertexBuffers 或 ID3D11DeviceContext::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/