【问题标题】:WPF 3D Dynamic TexturesWPF 3D 动态纹理
【发布时间】:2012-04-23 20:38:41
【问题描述】:

我正在编写一个程序(c# .NET 4.0 WPF 3D)来渲染地球切片(如 OpendTect 或 Petrel 的地震模块)。

问题是我需要能够深入放大,并且仍然可以看到细节。

我尝试放置一个巨大的详细纹理 (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));

【问题讨论】:

    标签: c# .net wpf 3d directx


    【解决方案1】:

    你有几个选择:

    • 优化当前解决方案。 5000 * 5000 * 4 大约是 100 MB。你如何加载和显示纹理?我有一个app,它可以渲染多达 1100 个 3d 对象并使用 300MB 内存,并且性能足够好。我强烈建议您运行分析器,不仅出于纯粹的性能原因,而且有助于捕获错误!我是 WPF 3D,感谢分析器,我发现我在做无用的镶嵌。
    • 创建一个完整纹理的低分辨率图像和一些小的高分辨率图像,它们是纹理的一部分。如果用户单击/放大,您将加载适合视口的小型高分辨率图像。与谷歌地图类似的效果。
    • 使用 XNA。您可以在 WPF 中托管 XNA 并使用 DXT 纹理。我不确定,但 WPF 不直接支持该纹理共振峰。

    【讨论】:

    • 感谢您的回复。我考虑过“谷歌地图方式” - 问题是如果你以放大模式扫描整个表面,应用程序将加载所有这些小的高分辨率图像,所以你会而不是一张大的高分辨率图像获得许多最终占用相同内存空间的小型高分辨率图像。
    • 5000*5000*4 确实是 100mb 左右。但是随着 c# 产生的所有开销,它变得如此之大,达到 300 mb。另外,巨大的纹理方式不是一个可行的解决方案——我会有很多切片,如果每个切片占用 200mb 内存,想象一下当存在 20 个切片时会发生什么。
    • 如果您将相机移到一个切片的视图之外,您将删除参考并且 GC 将收集内存。我建议你阅读这篇文章stackoverflow.com/questions/538060/…。其次,hugh 纹理是一个好方法,但使用 DXT - 它是压缩格式,应该使用大约 1/8 的内存。
    猜你喜欢
    • 2010-10-30
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    相关资源
    最近更新 更多