2013-05-29 78 views
0

我嘗試使用OpenGL和光線投射實現體積渲染器。一切運作良好,但當我看到負面方向時,我會遇到性能問題。這意味着如果我看正x方向(觀看向量1,0,0)表現正常。但是如果我查看負x方向(-1,0,0),則幀速率降低到2-3 fps。 我使用3D紋理來保存im數據集的數據。 GPU上的紋理緩存可能存在問題嗎?或者當我看到消極的方向時,幀率下降的問題是什麼?OpenGL與3D紋理性能不佳

如果我得到一些tipps,那會很好,問題可能是什麼。

+1

也許這是你通過3D捲進行光線追蹤的問題。我認爲沒有理由期望這可以*快*當你可能做了幾十個紋理訪問*每個片段*。 –

+0

我知道我爲每個片段做了很多紋理訪問,我實現了一些優化的東西。當射線有正向時,我的射線很快。所以GPU可以處理這些內存訪問。 – user1844213

+0

我已將Mig和Mag濾鏡設置爲GL_NEAREST,並且性能變得稍微好一些,但並不完美。將3D紋理更改爲紋理緩衝區對象會變得更加高效嗎? – user1844213

回答

1

有在這種情況下,要考慮兩件事情:

  • 內存訪問模式

  • 紋理數據交換

一個GPU的性能受到該模式的強烈影響從內存訪問數據的地址。一個射線投影儀從視圖的前後投射射線(或者在相反的方向上,取決於實現和內部混合模式),因此根據從哪個側面看3D紋理,您可以獲得完全不同的訪問模式。這可能會產生非常大的影響。

3D紋理消耗非常大量的內存。 OpenGL使用抽象內存模型,對紋理等對象的大小沒有明確的限制。要麼加載他們的作品與否。如果驅動程序可以管理它,則可以加載大於GPU內存容量的紋理。對於OpenGL數據,GPU內存實際上是一個緩存。如果您的3D紋理恰好大於可用的GPU內存,那麼OpenGL實現會在渲染時訪問紋理數據。如果你的訪問模式是幸運的,這個交換處理很好地適應「差距」,並且可以在需要之前將紋理數據流式傳輸到緩存中(我的意思是GPU存儲器),而不會拖延渲染過程。然而,不同的訪問模式(其他視圖)在按需交換數據時不能很好地工作,從而摧毀性能。

我建議你減小3D紋理的大小。

+0

我認爲紋理數據交換不是問題。我在渲染過程中分析了GPU的內存,加載紋理後有足夠的可用內存。我認爲內存訪問模式可能是正確的想法。我可以使用OpenGL更改或影響內存訪問模式嗎?我找不到任何關於它的事情。 – user1844213

+0

@ user1844213:你無能爲力。處理幀緩衝區a上的碎片的順序要麼由GPU /驅動程序組合進行硬編碼或硬連線處理,並且在光線渲染器中,除了選擇在哪個方向上處理光線以外,還有其他幾點。某些直接體積渲染樣式可以從前到後進行處理,並提早終止(每根射線),而其他直接體積渲染樣式只能回到前面,並且必須處理體積內的整個跨度。你可以獲得更快的GPU;)射線二次採樣可以產生很大的影響;它是我在遇到性能問題時轉向的一個「旋鈕」。 – datenwolf