我是图形新手,所以我要征求意见/建议。
我想创建(并渲染)一个由较小的立方体(体素)制成的大立方体。诀窍是我希望能够随意删除体素。
一种方法是使用实例渲染。在Direct3D中,我可以使用两个缓冲区: 第一个缓冲区将包含一个多维数据集的单个实例的数据(例如,顶点位置,纹理坐标,法线等)。 第二个缓冲区将在第二个缓冲区中包含每个体素的位置。
答案 0 :(得分:1)
有很多不同的方式来渲染体素,各有其优缺点。从这个问题看来,您好像要使用Minecraft场景。
具有合理性能的相当简单的实现方法就是将世界分解为一定大小的“块”。这些块中的每个块都有一个关联的顶点缓冲区,并且当某个块被删除或以某种方式更改时,该块的顶点缓冲区将更新。渲染时,将为每个块发出绘图调用。
为块选择正确的尺寸对于性能非常重要。如果块太大,则在块更改时重新构建顶点缓冲区将耗资巨大。如果块太小,那么块的总数将会很大,渲染所有块时都会引入驱动程序开销。
为提高性能,可以应用进一步的掩埋算法,以避免在顶点缓冲区中添加隐藏的三角形。
您可以做很多事情来提高性能,并突破可渲染体素的极限,但这是一个很好的起点。
答案 1 :(得分:0)
首先,我假设您的大立方体是动态的:它们可以移动/旋转,并且它们的体素可以动态隐藏/可见。如果一切都是静态的,那么有比此答案更好的方法。
如您所描述的,实例化是一种很好的性能解决方案,因为只有一个绘制调用才能渲染所有体素(与逐个渲染每个体素相比)
现在可以在此处隐藏任何体素是您可以使用的技巧:在实例化数据缓冲区中,您可以添加比例值以及位置,然后只需设置比例要隐藏体素时为零。