【问题标题】:Fastest way to deal with multiple textures in OpenGL?在OpenGL中处理多个纹理的最快方法?
【发布时间】:2021-05-29 13:58:12
【问题描述】:

对于每种类型的纹理(环境、漫反射、镜面反射等),assimp 将返回一个纹理列表。我们如何处理这么多纹理?

似乎每个模型的纹理绑定数量可能会急剧增加。如果我们能够将纹理类型的每个列表转换为单个纹理数组或贴图,那会很有趣,这可能吗?

只是为了让您形象化,在我的代码中我有这个 Material 类:

class Material {
     private:
        Shader* shader;

        Texture* diffuseMap;
        Texture* specularMap;
        Texture* emissiveMap;
        
        float shineness;
    public:
        [...]
};

所以我正在尝试将纹理列表转换为与其类型对应的单个贴图。

【问题讨论】:

  • 放置多个纹理是一种称为“纹理图集”。请注意,您必须调整 uv 坐标,并且您可能必须自己处理夹紧/重复。
  • 我明白了,谢谢。要搜索这个,你有什么好的来源或建议我可以去哪里寻找它?
  • 我记得的唯一参考是whitepaper from NVIDIA。还有一个talk from SIGGRAPH 2014,尽管它是一种比将图像粘贴在一起更复杂的方法。
  • 谢谢!我快速阅读了 NVIDIA 论文,它看起来就像我正在寻找的东西。我会看看我是否能理解并尝试实施它。希望我能让它工作,然后我会回到这里更新帖子。

标签: c++ opengl assimp


【解决方案1】:

纹理图集(@BDL 在评论中提到)是一种选择。另一种是纹理数组,它存在于 1D 和 2D 纹理中,但是 - 根据您的情况 - 具有强制所有图像使用相同格式的缺点。

最终比率将是无绑定纹理,您只需将纹理的 64 位 ID 传递给着色器,而不将其绑定到纹理单元:https://www.khronos.org/opengl/wiki/Bindless_Texture

【讨论】:

  • 嗯,你的意思是无绑定纹理比其他两种方法提供更多的性能?好像只支持nvidia卡吧?看起来也有点复杂,哈哈。在我看来,Texture Atlases 似乎是一种更简单的方法。感谢您的宝贵时间!
  • @Ariel:通过跨平台的 ARB 扩展支持无绑定纹理。就性能而言:这取决于。通过精心安排的纹理绑定,可以轻松胜过糟糕的无绑定访问模式。但在一般情况下,bindless 的开销要少得多,因此有可能产生最佳性能。
猜你喜欢
  • 1970-01-01
  • 2012-09-23
  • 2013-11-07
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多