我尝试使用OpenGL和光线投射实现Volume Renderer。一切都运作良好,但当我看向负面方向时,我遇到了性能问题。这意味着如果我看向正x方向(查看矢量1,0,0)表现良好。但是如果我看向负x方向(-1,0,0),帧速率会下降到2-3 fps。 我使用3D纹理来保存im数据集的数据。在GPU上缓存纹理可能有问题吗?或者当我看向负方向时,帧率下降的问题是什么?
如果我得到一些问题就会很好,问题可能是什么。
答案 0 :(得分:1)
在这种情况下,有两件事需要考虑:
和
GPU的性能受到从内存访问数据的模式的强烈影响。射线施法者将光线从视图的前方投射到后方(或反方向,具体取决于实施和内部混合模式),因此根据您在3D纹理的哪一侧获得完全不同的访问模式。这可能会产生很大的影响。
3D纹理消耗非常大量的内存。 OpenGL使用抽象内存模型,对纹理等对象的大小没有明确的限制。加载它们是否有效。如果驱动程序可以管理它,您可以加载大于适合GPU内存的纹理。有效地,GPU内存是用于OpenGL数据的缓存。如果你的3D纹理碰巧比可用的GPU内存大,那么OpenGL实现会在渲染时访问纹理数据。如果你的访问模式很幸运,那么这个交换处理很好地适应“间隙”,可以在需要之前将纹理数据流式传输到缓存(我指的是GPU内存),而不会拖延渲染过程。但是,不同的访问模式(其他视图)无法与按需交换数据一起使用,从而破坏性能。
我建议你缩小3D纹理的大小。