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));
感谢您的回复。我曾经想过“谷歌地图的方式” - 问题是,如果您在放大模式下扫描整个表面,应用程序将加载所有这些小型高分辨率图像,所以不是一个大的高分辨率图像,而是获得许多小高分辨率图像,最终占用相同的内存空间。 – 2012-04-23 12:19:54
5000 * 5000 * 4确实约为100MB。但是,随着C#创建的所有开销,它变得非常大,为300 MB。此外,巨大的纹理方式并不是一个可行的解决方案 - 我会有很多切片,并且如果每个切片需要200mb的内存,想象当20切片出现时会发生什么。 – 2012-04-23 12:23:44
如果您将相机移动到一个切片的视图之外,您将删除参考,GC将收集内存。我建议你阅读这篇文章http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface。不过,休格纹理是一个好方法,但是使用DXT--它是压缩格式,应该使用大约1/8的内存。 – 2012-04-23 12:36:02