Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
OpenGL体素引擎慢 我在C++和OpenGL中制造了一个体素引擎,并且在ATI X1600上不能在3GHz上获得像样的FPS。我完全没有主意了_C++_Opengl_Voxel - Fatal编程技术网

OpenGL体素引擎慢 我在C++和OpenGL中制造了一个体素引擎,并且在ATI X1600上不能在3GHz上获得像样的FPS。我完全没有主意了

OpenGL体素引擎慢 我在C++和OpenGL中制造了一个体素引擎,并且在ATI X1600上不能在3GHz上获得像样的FPS。我完全没有主意了,c++,opengl,voxel,C++,Opengl,Voxel,当我在屏幕上有大约12000个立方体时,它会下降到20fps以下——真可怜 到目前为止,我所做的优化是:截锥剔除、背面剔除(通过OpenGL的glEnable(GL_CULL_face)),引擎只绘制可见的面(当然,剔除的面除外),它们位于八叉树中 我尝试过VBO,我不喜欢它们,它们也不会显著提高fps Minecraft的引擎怎么能这么快。。。我要处理10000个立方体,而Minecraft可以轻松地以更高的fps绘制更多立方体 有什么想法吗?您是否为所有多维数据集使用了通用显示列表? 您是否

当我在屏幕上有大约12000个立方体时,它会下降到20fps以下——真可怜

到目前为止,我所做的优化是:截锥剔除、背面剔除(通过OpenGL的glEnable(GL_CULL_face)),引擎只绘制可见的面(当然,剔除的面除外),它们位于八叉树中

我尝试过VBO,我不喜欢它们,它们也不会显著提高fps

Minecraft的引擎怎么能这么快。。。我要处理10000个立方体,而Minecraft可以轻松地以更高的fps绘制更多立方体


有什么想法吗?

您是否为所有多维数据集使用了通用显示列表?

您是否跳过调用用户不可见的多维数据集的绘图代码?

您应该分析代码,以确定应用程序中的瓶颈是否在CPU或GPU上。例如,您的剔除/八叉树算法可能很慢,在这种情况下,这根本不是OpenGL的问题

我还将记录您在每一帧上绘制的立方体的数量,并将其显示在屏幕上。只是想让你知道你的筛选程序按预期工作

最后,你没有提到你的立方体是否有纹理。尝试使用较小的纹理或禁用纹理,然后查看帧率增加了多少

是一个很好的工具,可以帮助您找到OpenGL的瓶颈


@genpfault:我分析连通性,只为外部可见表面生成面。VBO有一个立方体,我用glTranslate()d

我不是OpenGL的专家,但据我所知,这将节省很少的时间,因为您仍然需要将每个立方体发送到卡中


相反,您应该为所有外部可见曲面生成面,将其放入VBO中,并将其发送到卡,然后继续渲染该VBO,直到几何体发生更改。这为您节省了大量的时间,您的卡实际上正在等待处理器向其发送几何体信息。

您可以使用第三方库来提高渲染效率。举例来说,C++可以以一种有效的方式获取一个卷并生成网格。它有内置的方法来减少三角形计数,并帮助生成环境光遮挡之类的内容。它周围有一个很好的社区,所以在论坛上获得支持应该很容易。

我不知道在这里“碰”一个老问题是否合适,但我想到了几件事:

如果体素是静态的,则可以通过使用八叉树进行平截头体剔除等来加快整个渲染过程。此外,还可以将静态场景编译为八叉树中的潜在可见性集。PVS的主要原理是为树中的每个节点预计算其他节点可能可见的节点,并将指向这些节点的指针存储在向量中。在渲染时,首先检查相机放置在哪个节点,然后对该节点的PVS向量中的所有节点运行截头体剔除(Carmack在地震引擎中使用了类似的方法,但使用了二进制空间分区树)

如果体素的着色有点复杂,那么也可以快速执行仅深度预处理过程,而不写入colorbuffer,只填充Depthbuffer。然后渲染第二遍:禁用写入Depthbuffer,并在检查Depthbuffer时仅渲染Colorbuffer。因此,您可以避免昂贵的着色器计算,这些计算随后会被更接近查看器的新片段覆盖。(Carmack在《地震3》中使用了这一点)

另一件肯定会加快速度的事情是使用实例。仅将每个体素的位置以及(如果必要)其比例和其他参数存储到texturebufferobject中。在vertexshader中,您可以读取要生成的体素的位置,并创建体素的实例(即在vertexbufferobject中提供给着色器的立方体)。因此,只需将8个顶点+8个法线(3*sizeof(float)*8+3*sizeof(float)*8+float表示颜色/纹理等)发送一次到VBO中的卡,然后只发送立方体实例的位置(3*sizeof(float)*体素数)

通过将所有3个步骤合并到2个线程中,GPU和CPU之间的并行化是可能的。在CPU线程中,您检查八叉树pvs并更新TBO以在下一帧中实例化,GPU线程同时渲染2个过程,同时使用TBO进行实例化,该TBO由CPU线程在上一步中创建。之后,您将切换TBO。如果相机没有移动,你甚至不必再次进行CPU计算

另一种你我感兴趣的树是所谓的k-d树,它比八叉树更一般


PS:对不起,我的英语不是最清晰的….

是的,每个面都在一个显示列表中,每个立方体都保存着要绘制的面和立方体位置的数据(GLTRANSTEF和glCallList)。另外,由于八叉树,当立方体不在视图中时,绘图部分被跳过。我认为立方体(而不是面)应该在显示列表中。在本例中,我将无论如何绘制所有面,即使是两个立方体之间的面(未显示),这需要更多资源。谢谢,我将尝试分析。我的方法是非常直接的,因为我基本上没有任何3D体验。。。那么算法呢?你是如何生成几何体的?例如,如果您有一个3x3x3的立方体盒,您是生成/渲染每个立方体(包括不可见的中心立方体),还是分析连通性并仅为外部可见曲面生成三角形?可能与您所说的尝试VBO重复,您是否有一个VBO包含一个您需要翻译的立方体()d到处都是,还是你把一堆立方体装进了一个VBO?我不相信Minecraft真的能显示更多