1

作为一个统一用户,我对如何实现类似于他们的静态批处理的东西感到困惑。多个网格(不同的网格但相同的材质)显示为在 1 个绘制调用中呈现,但是我没有找到如何在 DirectX 中做到这一点。

我可以看到如何使用 Draw() 在 DirectX 中绘图。我知道您可以在一次调用中多次绘制相同的网格(DrawiInstanced()?)但是我不明白如何在一次绘制调用中绘制多个不同的网格。我很想被指出正确的方向,或者给出一个示例,显示一个立方体和一个三角形在共享单一材质的单个绘制调用中渲染。

我正在使用 DirectX11.1 并通过 SharpDX 这样做,首选 SharpDX 示例,但 DX 很好,但是如果正确的方法改变了,则没有 DX9/10 示例,我只对 DX11 感兴趣。

谢谢。

4

1 回答 1

1

没有自动执行此操作的机制,但如果您有多个共享输入布局和“材质”(着色器、纹理等)的网格,您可以简单地连接顶点和索引缓冲区(将索引修补到基础顶点偏移为必要的)。

作为绘制立方体和三角形的示例,只需将您的 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);
于 2013-10-11T01:56:37.003 回答