OpenGL使用3D纹理时性能不佳

OpenGL使用3D纹理时性能不佳,opengl,glsl,volume-rendering,Opengl,Glsl,Volume Rendering,我尝试用OpenGL和光线投射实现一个体积渲染器。一切都很好,但当我从消极的角度看问题时,我会遇到性能问题。这意味着如果我朝正x方向看(查看向量1,0,0),性能就可以了。但是如果我从负x方向看(-1,0,0),帧速率会下降到2-3fps。 我使用3D纹理来保存im数据集的数据。GPU上的纹理缓存是否有问题?或者,当我朝负方向看时,帧速率下降会是什么问题 如果我能得到一些TIPS,那就太好了。问题是什么。 < P>在这种情况下,有两件事要考虑:< /P> 内存访问模式 及 纹理数据交换

我尝试用OpenGL和光线投射实现一个体积渲染器。一切都很好,但当我从消极的角度看问题时,我会遇到性能问题。这意味着如果我朝正x方向看(查看向量1,0,0),性能就可以了。但是如果我从负x方向看(-1,0,0),帧速率会下降到2-3fps。 我使用3D纹理来保存im数据集的数据。GPU上的纹理缓存是否有问题?或者,当我朝负方向看时,帧速率下降会是什么问题


如果我能得到一些TIPS,那就太好了。问题是什么。

< P>在这种情况下,有两件事要考虑:< /P>
  • 内存访问模式

  • 纹理数据交换
GPU的性能受从内存访问的数据寻址模式的强烈影响。光线投射器将其光线从视图的前面投射到后面(或以相反方向投射,具体取决于实现和内部混合模式),因此根据查看3D纹理的方向,可以获得完全不同的访问模式。这会产生很大的影响

3D纹理消耗大量内存。OpenGL使用一个抽象内存模型,在这个模型中,像纹理这样的对象的大小没有明确的限制。要么加载它们,要么不加载。如果一个驱动程序可以管理它,你可以加载比GPU内存更大的纹理。实际上,GPU内存是OpenGL数据的缓存。如果3D纹理恰好大于可用的GPU内存,则OpenGL实现会在渲染时访问纹理数据时交换纹理数据。如果您的访问模式很幸运,这种交换处理很好地适应了“间隙”,并且可以在需要之前将纹理数据流到缓存中(我指的是GPU内存),而不会延迟渲染过程。但是,不同的访问模式(其他视图)不适合按需交换数据,从而影响性能


我建议您减小3D纹理的大小。

可能是通过3D体积进行光线跟踪的问题。我看不出有什么理由期望这样做很快,因为你可能会对每个片段进行几十次纹理访问。我知道我对每个片段进行了很多纹理访问,我已经实现了一些优化功能。当光线具有正方向时,我的光线投射速度很快。所以GPU可以处理这么多的内存访问。我已经将Mig和Mag过滤器设置为GL_NEAREST,性能会稍微好一点,但并不完美。将3D纹理更改为纹理缓冲区对象是否会更有效?我认为纹理数据交换不是问题所在。我分析了渲染期间GPU的内存,加载纹理后有足够的可用内存。我认为内存访问模式可能是正确的想法。我可以用OpenGL更改或影响内存访问模式吗?我找不到任何关于它的信息。@user1844213:你对此无能为力。帧缓冲区上的片段被GPU/驱动程序组合硬编码或硬连线处理的顺序,在光线投射器中,只需选择处理光线的方向。某些直接体渲染样式可以前后处理并提前终止(每光线),而其他样式只能前后处理,并且必须在体积内处理整个范围。您可以获得更快的GPU;)射线子采样也会产生很大的影响;它是我遇到性能问题时打开的一个“旋钮”。