2012-04-23 56 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