作为 Unity 用户,我对如何实现类似于他们的静态批处理的东西感到困惑。多个网格(不同的网格但相同的材料(显示为在 1 次绘制调用中渲染,但是我没有找到如何在 DirectX 中做到这一点。
我可以看到如何使用 Draw(( 在 DirectX 中绘制。我知道您可以在一次调用中多次绘制相同的网格(DrawiInstanced((?(,但是我不明白如何在一次绘制调用中绘制多个不同的网格。我很想被指向正确的方向,或者给出一个示例,显示一个立方体和一个三角形在单个绘制调用中呈现,共享单个材质。
我正在使用DirectX11.1并通过SharpDX进行,首选SharpDX示例,但DX示例很好,但是如果正确的方法发生了变化,则没有DX9/10示例,我严格只对DX11感兴趣。
谢谢。
没有自动执行此操作的机制,但是如果您有多个共享输入布局和"材质"(着色器、纹理等(的网格,则可以简单地连接顶点和索引缓冲区(根据需要将索引修补到基本顶点偏移量(。
作为绘制立方体和三角形的示例,只需将 VB 设置为包含两者:
float cubeAndTriangleVertices[] =
{
-1, -1, -1, // cube vertices
-1, -1, 1,
-1, 1, -1,
-1, 1, 1,
1, -1, -1,
1, -1, 1,
1, 1, -1,
1, 1, 1,
2, 0, 0, // triangle vertices
2, 1, 0,
3, 0, 0,
};
D3D11_SUBRESOURCE_DATA cubeAndTriangleVData = { cubeAndTriangleVertices };
device->CreateVertexBuffer(&cubeAndTriangleVData, &vb);
unsigned short cubeAndTriangleIndices[] =
{
0, 2, 1, 2, 3, 1, // -x face
7, 6, 5, 6, 4, 5, // +x face
0, 1, 4, 4, 1, 5, // -y face
2, 6, 3, 6, 7, 3, // +y face
6, 2, 0, 4, 6, 0, // -z face
3, 7, 1, 7, 5, 1, // +z face
8, 9, 10, // triangle
}
D3D11_SUBRESOURCE_DATA cubeAndTriangleIData = { cubeAndTriangleIndices };
device->CreateIndexBuffer(&cubeAndTriangleIData, &ib);
// ...pipeline setup
context->DrawIndexed(6 * 6 + 3, 0, 0);