【发布时间】:2013-05-31 14:31:15
【问题描述】:
我想绘制大量相同纹理的四边形(平铺映射)。带纹理的四边形将具有相同的大小和相同的纹理坐标,但屏幕上的坐标不同。
我使用VertexBuffer 和DrawPrimitive(D3DPT_TRIANGLELIST, ...)
如果四边形一个接一个地定位,我可以使用纹理重复(设置纹理坐标 > 1)并且在 VertexBuffer 中只有 6 个顶点。
如果四边形位于不同的位置,我会在VertexBuffer 中为每个四边形创建 6 个顶点,这种方法性能较差(在强大的计算机上从 1500000 个顶点开始不到 60 FPS)。
SOFTWARE_VERTEXPROCESSING 用于兼容性目的。
有没有更好的方法在不同位置绘制大量相同纹理的小四边形?
提前致谢。
【问题讨论】:
-
我认为
SOFTWARE_VERTEXPROCESSING可能是性能不佳的嫌疑人 - 您是否在有/没有此标志的情况下进行了基准测试? -
HARDWARE_VERTEXPROCESSING解决了这种情况并提供恒定的 60 FPS(没有 VSync 的 100+ FPS),但应用程序也应该能够在仅支持SOFTWARE_VERTEXPROCESSING的硬件上顺利运行,例如在旧的 Intel 芯片组上。我想知道除了在VertexBuffer中为每个四边形创建顶点之外还有其他解决方案(正如已经提到的四边形大小和纹理坐标相同,所以基本上只有屏幕上的位置不同)。 -
您可以使用两个顶点流。一个用于四边形,一个用于位置。在顶点着色器中,您可以将它们组合起来以获得正确的定位。你渲染平铺平面(2D 还是 3D?)或像我的世界这样的块或目的是什么?
-
我渲染平铺的 2D 平面。 2个顶点流有帮助吗?我只在创建后(静态位置)并根据
MS 2010 Performance Analyzer不更新每帧的顶点缓冲区@ 大多数 CPU 用于Present。 -
如果都是静态的,我认为 2 个流没有帮助,它用于减少绘制调用或带宽使用。你总是看到所有的瓷砖吗? (很高兴听到你想用瓷砖实现什么,所以我没有猜测你的场景是什么样子)如果不是,你应该谷歌搜索“查看截锥体剔除”(可能在你的情况下使用四叉树) : 最快的三角形是没有画出来的;)