gpt4 book ai didi

opengl - 如何管理纹理

转载 作者:行者123 更新时间:2023-12-01 10:13:04 26 4
gpt4 key购买 nike

我正在编写一个基于 OpenGL 的简单 3D 引擎(我知道有很多这样的引擎,但出于某些原因我想自己学习如何做)。我对我目前的场景图方法和类似的东西非常满意,但我对纹理处理非常不满意。所以我想知道如何正确地做到这一点。

当我在 Internet 上查看示例代码时,他们从未谈论过如何管理纹理。他们只是在应用程序启动时加载一些纹理,展示他们的演示内容,然后程序退出。但是如果我经常改变场景中的东西怎么办?如果我想显示一个有 10 个纹理的场景,然后我在场景中删除一个节点,这样就不再需要 2 个纹理,然后我添加一个有 4 个新纹理的新节点,该怎么办?所以必须从视频 RAM 中删除 2 个旧纹理,我必须添加 4 个新纹理。然后我完全替换了整个场景,所以必须再次删除所有未使用的纹理并加载新纹理,同时必须重新使用之前使用过并且也在新场景中使用的纹理。这听起来很复杂。

专业 3D 引擎中的纹理是如何管理的?它是一个全局单例纹理管理器,它使用引用计数器跟踪纹理使用情况并不时清理视频内存吗?还是有更天才的方法来做到这一点?

最佳答案

我认为您在这里需要意识到的一点是,您要解决的问题并非纹理独有,而是所有游戏资源的问题。我认为最好的解决方案是将依赖项跟踪与引用计数相结合的自动化方法。对于游戏中您想要的每个“事物”,您应该有某种根文件来引用该“事物”使用的所有其他 Assets (声音、纹理、模型、粒子效果)。您应该有某种工具或构建脚本来打包每个项目的所有 Assets 。在您创建任何“东西”之前,您需要加载适当的包。你加载的每一个东西都会 addrefs 包,而包又会 addrefs 所有加载的资源。您知道一旦引用计数变为 0 就可以安全地删除资源或整个包。

这种方法的另一个好处是,您可以为自己设定内存预算,并在构建时而不是运行时检查它们,因为您知道每个包有多大。此外,包可以共享资源,因此如果另一个包已经添加引用,您可以确保不要多次加载它们。

关于opengl - 如何管理纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3726738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com