查看特定方向时的Opengl低FPS

查看特定方向时的Opengl低FPS,opengl,Opengl,我正在绘制由数千个立方体组成的曲面。然而,当我朝正Z方向看时——那就是光线所在的地方,我会得到低fps和伪影。 这是当我朝负Z方向看时的样子: 这是当我朝正Z方向看时的样子,也会显著降低fps: 您可能取决于多维数据集的呈现顺序。这就解释了为什么在看+Z和-Z之间存在差异。当从后面到前面渲染时,每个立方体的每个片段都会被渲染。使用深度测试前后渲染时,大多数片段将被丢弃。至于你看到的人工制品,可能是Z-fighting,但这是一个很长的机会 您可能取决于立方体的渲染顺序。这就解释了为什么在看+Z和

我正在绘制由数千个立方体组成的曲面。然而,当我朝正Z方向看时——那就是光线所在的地方,我会得到低fps和伪影。 这是当我朝负Z方向看时的样子: 这是当我朝正Z方向看时的样子,也会显著降低fps:

您可能取决于多维数据集的呈现顺序。这就解释了为什么在看+Z和-Z之间存在差异。当从后面到前面渲染时,每个立方体的每个片段都会被渲染。使用深度测试前后渲染时,大多数片段将被丢弃。至于你看到的人工制品,可能是Z-fighting,但这是一个很长的机会

您可能取决于立方体的渲染顺序。这就解释了为什么在看+Z和-Z之间存在差异。当从后面到前面渲染时,每个立方体的每个片段都会被渲染。使用深度测试前后渲染时,大多数片段将被丢弃。至于你看到的人工制品,可能是Z-fighting,但这是一个很长的机会

性能下降有多严重?如果对几何体执行仅Z向的预传递,跳过对颜色缓冲区的写入(并使用非常简单的传递片段着色器),则可以在几何体顺序较差/未排序且填充率有限的情况下大大提高性能。然而,这只在您进行复杂的片段处理时有用;它引入了两倍的顶点变换开销,因为基本上所有东西都要绘制两次。您的情况可能是顶点绑定,也可能是碎片绑定,因为组合立方体曲面并不是渲染大型平面曲面的最有效方法

我的另一个建议是,既然您提到渲染由“数千个立方体”组成的场景,那么应该实现类似于体素折叠的东西。本例中的所有立方体似乎都在同一平面上,您可以轻松地将此类立方体集合的面替换为组合相邻立方体的较少面。Minecraft通过使用贪婪网格算法周期性地重新网格化场景中动态更新的部分来实现这一点


当然,空间分区是另一个问题,但我假设您已经有了某种系统?

这种性能下降有多糟糕?如果对几何体执行仅Z向的预传递,跳过对颜色缓冲区的写入(并使用非常简单的传递片段着色器),则可以在几何体顺序较差/未排序且填充率有限的情况下大大提高性能。然而,这只在您进行复杂的片段处理时有用;它引入了两倍的顶点变换开销,因为基本上所有东西都要绘制两次。您的情况可能是顶点绑定,也可能是碎片绑定,因为组合立方体曲面并不是渲染大型平面曲面的最有效方法

我的另一个建议是,既然您提到渲染由“数千个立方体”组成的场景,那么应该实现类似于体素折叠的东西。本例中的所有立方体似乎都在同一平面上,您可以轻松地将此类立方体集合的面替换为组合相邻立方体的较少面。Minecraft通过使用贪婪网格算法周期性地重新网格化场景中动态更新的部分来实现这一点



当然,空间划分是另一个问题,但我假设您已经有了某种系统?

您是否实现了某种剔除?当立方体接触时,如何渲染它们?低fps通常表示大量计算,如果不尽可能减少顶点数,可能会发生这种情况。我已启用背面剔除。立方体在触摸时的渲染方式与它们在单个时的渲染方式相同。这些瑕疵看起来如何?您可以在第二张图片中看到,这并不明显,但肯定会出现皱纹,这可能是由于两个立方体的边缘相邻而造成的。您是否实施了某种剔除?当立方体接触时,如何渲染它们?低fps通常表示大量计算,如果不尽可能减少顶点数,可能会发生这种情况。我已启用背面剔除。立方体在触摸时呈现的效果与它们在单体时相同。这些瑕疵看起来如何?你可以在第二张图中看到,这并不明显,但肯定会出现皱纹,这可能是由于两个立方体的边缘相邻造成的。这是有道理的。除了手动解决方案之外,是否还有其他方法可以启用前后渲染?有多种方法可以优化渲染。这实际上取决于你的代码的真正应用(我猜你并不真的想用几千个立方体来画地板)。但在这种特殊情况下,不会渲染被遮挡的面(遮挡查询、背面剔除、排序、仅渲染一个大球体…)。我们需要更多的细节来进一步帮助您。但我想你已经可以试试了。希望如此helps@user1760770:OpenGL不是场景图。这是一个绘图API。它按照你告诉它的顺序画东西,这是有道理的。除了手动解决方案之外,是否还有其他方法可以启用前后渲染?有多种方法可以优化渲染。这实际上取决于你的代码的真正应用(我猜你并不真的想用几千个立方体来画地板)。但在这种特殊情况下,不会渲染被遮挡的面(遮挡查询、背面剔除、排序、仅渲染一个大球体…)。我们需要更多的细节来进一步帮助您。但我想你已经可以试试了。希望如此helps@user1760770:OpenGL不是场景图。这是一个绘图API。它按照你告诉它的顺序画东西。是的,我画。我在最初的帖子中遇到的问题正如Jean-Simon Brochu所暗示的