Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在XNA 4.0中使用DynamicVertexBuffer_C#_Xna_Vertex_Vertex Buffer - Fatal编程技术网

C# 在XNA 4.0中使用DynamicVertexBuffer

C# 在XNA 4.0中使用DynamicVertexBuffer,c#,xna,vertex,vertex-buffer,C#,Xna,Vertex,Vertex Buffer,我阅读了DynamicVertexBuffer,以及它如何更好地处理经常变化的数据。我有一个由立方体构建的世界,我需要将立方体的顶点存储在这个缓冲区中,以便将它们绘制到屏幕上 但是,并不是所有的立方体都有顶点(有些是空气,是透明的),也不是所有立方体的面都需要绘制(它们彼此面对),所以如何跟踪哪些顶点存储在缓冲区中的位置?此外,某些面需要最后绘制,即其中具有透明度的面(如玻璃或树叶),并且这些面也需要按从后到前的顺序绘制,以避免扰乱alpha混合 如果所有这些顶点都任意存储在此缓冲区中,我如何知

我阅读了DynamicVertexBuffer,以及它如何更好地处理经常变化的数据。我有一个由立方体构建的世界,我需要将立方体的顶点存储在这个缓冲区中,以便将它们绘制到屏幕上

但是,并不是所有的立方体都有顶点(有些是空气,是透明的),也不是所有立方体的面都需要绘制(它们彼此面对),所以如何跟踪哪些顶点存储在缓冲区中的位置?此外,某些面需要最后绘制,即其中具有透明度的面(如玻璃或树叶),并且这些面也需要按从后到前的顺序绘制,以避免扰乱alpha混合

如果所有这些顶点都任意存储在此缓冲区中,我如何知道哪些顶点在哪里


此外,顶点的数量可以更改,但DynamicVertexBuffer对我来说似乎不是很动态,因为我根本无法更改它的大小。每次需要添加或删除面时,我都必须重新创建缓冲区吗?

听起来你的做法是错误的——假设你的世界中只有很少数量的立方体。您应该将世界(及其多维数据集)存储在一个自定义数据结构中,该数据结构允许您快速确定哪些多维数据集(和面)在查看给定方向时根据您的世界规则从给定点可见

然后,每次渲染场景时,只生成这些面的成批顶点缓冲区。因此,不要使用顶点缓冲区作为存储整个世界几何体的基础。顶点缓冲区是渲染工具,而不是世界场景图工具

这种大规模的可见性问题在代码中运行要比GPU快得多。例如,如果你坐在原点,看+x,你可以立即忽略-vex方向上的所有立方体,这是一个非常简单的例子

有关oct树渲染的更完整示例搜索。这种渲染会很好地匹配您的世界布局


最后一个提示-当我说生成成批顶点缓冲区时-我的意思是以最小化GPU状态变化的方式(例如,相同的纹理、相同的着色器等)将立方体批处理在一起。最小化对GPU状态的更改是优化渲染的关键—一旦您从渲染中尽可能地剔除面。

听起来您是在以错误的方式处理此问题—假设您的世界中只有很少数量的立方体。您应该将世界(及其多维数据集)存储在一个自定义数据结构中,该数据结构允许您快速确定哪些多维数据集(和面)在查看给定方向时根据您的世界规则从给定点可见

然后,每次渲染场景时,只生成这些面的成批顶点缓冲区。因此,不要使用顶点缓冲区作为存储整个世界几何体的基础。顶点缓冲区是渲染工具,而不是世界场景图工具

这种大规模的可见性问题在代码中运行要比GPU快得多。例如,如果你坐在原点,看+x,你可以立即忽略-vex方向上的所有立方体,这是一个非常简单的例子

有关oct树渲染的更完整示例搜索。这种渲染会很好地匹配您的世界布局


最后一个提示-当我说生成成批顶点缓冲区时-我的意思是以最小化GPU状态变化的方式(例如,相同的纹理、相同的着色器等)将立方体批处理在一起。最小化对GPU状态的更改是优化渲染的关键—一旦您从渲染中尽可能地剔除面。

我想您的意思是“忽略-ve x方向上的所有面”。无论如何,谢谢你提供的信息。纹理都取自同一个纹理贴图,因此这不是问题。但是假设我向世界添加了一个立方体,这个立方体被放置在某个地方,所以它需要渲染。在哪里添加顶点?在不修改存储所有其他顶点的位置的大小的情况下,如何向GPU通知此新立方体?我将查看八叉树渲染,我已经看到了提到的四叉树和八叉树。我的意思是忽略-vex方向上的所有立方体,假设立方体的数据结构级别高于面。如果您可以忽略一个立方体,那么您可以自动忽略所有6个面-因此,首先删除立方体会更快,然后当您设置了一组可能可见的立方体时,您会尝试删除面。您仍然认为顶点缓冲区是跨帧持久的。在大多数发动机中,情况并非如此。每帧从头开始填充顶点缓冲区。当然你可以分配空间,但是你需要重建数据。可能可见的面集将在每一帧中更改。如果你想一想,你可能会有一个有数百万个立方体的世界,但是,要渲染的每一帧面尽可能少(可能只有几百个),关键在于使每一帧的顶点缓冲区的大小尽可能小。对于小型移动或几何体(例如移动的演员),可能会有一些例外,在这些情况下,将所有顶点保持在同一个位置可能是有意义的缓冲区,让着色器完成繁重的工作。但是对于像立方体这样的大范围的世界几何体,你可能应该用不同的方法来处理这个问题。这些立方体是规则的吗?它们的大小都一样,所有的轴都以相同的间距对齐吗?在这种情况下,您的自定义数据结构中甚至没有顶点——在渲染特定立方体之前,您不需要它们。在这种情况下,可能会有大量优化—不要在顶点缓冲区中传递立方体面—只需将每个立方体的中心作为一个顶点传递,并让着色器计算出可见面。我认为您的意思是“忽略-ve x方向上的所有面”。无论如何,谢谢你提供的信息。这些纹理都取自同一个纹理贴图,因此这不是一个p