2012-04-23 68 views
3

我正在編寫一個渲染地球片(如OpendTect或Petrel的地震模塊)的程序(c#.NET 4.0 WPF 3D)。WPF 3D動態紋理

問題是,我需要能夠深入放大,並仍然可以看到細節。

我嘗試了一個巨大的細節紋理(5000x5000),但它吃了太多的內存(200-300 MB),並且當我嘗試增加尺寸時崩潰。

現在我想看看是否有任何使用動態紋理的方法 - 根據到相機的距離而改變的紋理。

或者可能有其他方式處理高分辨率表面?

我使用此代碼加載質地:

wbm = new WriteableBitmap(
(int)1306*scale, 
(int)ns*scale, 
96, 
96, 
PixelFormats.Indexed8, 
new BitmapPalette(getColors())); 

... 

visual3d.Material = visual3d.BackMaterial 
= new DiffuseMaterial(new ImageBrush(wbm)); 

回答

1

您有幾種選擇在這裏:

  • 優化目前的解決方案。 5000 * 5000 * 4大約100 MB。你如何加載和顯示紋理?我有一個app,可渲染1100個3d對象,並使用300MB內存,性能足夠好。我強烈建議你運行一個探查器,不僅僅是出於純粹的性能原因,它有助於發現錯誤!我的WPF 3D,感謝探查器,我發現我正在做無用的鑲嵌。
  • 創建一個整體紋理的低分辨率圖像和幾個小的高分辨率圖像,它們是紋理的一部分。如果用戶點擊/放大,您將加載適合視口的小高分辨率圖像。谷歌地圖的效果類似。
  • 使用XNA。您可以在WPF中託管XNA並使用DXT紋理。我不確定,但WPF不直接支持紋理共振。
+0

感謝您的回覆。我曾經想過「谷歌地圖的方式」 - 問題是,如果您在放大模式下掃描整個表面,應用程序將加載所有這些小型高分辨率圖像,所以不是一個大的高分辨率圖像,而是獲得許多小高分辨率圖像,最終佔用相同的內存空間。 – 2012-04-23 12:19:54

+0

5000 * 5000 * 4確實約爲100MB。但是,隨着C#創建的所有開銷,它變得非常大,爲300 MB。此外,巨大的紋理方式並不是一個可行的解決方案 - 我會有很多切片,並且如果每個切片需要200mb的內存,想象當20切片出現時會發生什麼。 – 2012-04-23 12:23:44

+0

如果您將相機移動到一個切片的視圖之外,您將刪除參考,GC將收集內存。我建議你閱讀這篇文章http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface。不過,休格紋理是一個好方法,但是使用DXT--它是壓縮格式,應該使用大約1/8的內存。 – 2012-04-23 12:36:02