OpenGL纹理管理

Posted

技术标签:

【中文标题】OpenGL纹理管理【英文标题】:OpenGL texture management 【发布时间】:2011-03-03 23:29:39 【问题描述】:

我正在推出我的第一个游戏引擎 :D。我现在正在做纹理资源管理器,我想把它做好。

仅填充驱动程序支持的所有 ActiveTexture 单元有什么不好吗?另一种方法是保留这些插槽,仅在实际需要时设置纹理,代价是更多的 glBindTexture 调用。

【问题讨论】:

“插槽”是什么意思?您只需根据需要在内存中保留尽可能多的纹理,并且(理想情况下)仅在必要时绑定,如果已经绑定了正确的纹理,则尽量避免调用。 对不起。我所说的插槽是指单位。就像您通过 glActiveTexture(...) 调用选择的东西一样;)。 【参考方案1】:

您提出问题的方式我认为您在纹理对象(即纹理存储)和纹理单元(即多重纹理背后的机制)之间存在误解。

OpenGL 有纹理对象和纹理单元。纹理对象保存数据,纹理单元将绑定到它们的纹理对象的数据映射到渲染过程中。

通常将场景所需的所有纹理上传到纹理对象中。对于每个使用通用材质设置的渲染批次,在渲染过程中将纹理绑定到正确的纹理单元。

【讨论】:

如果我的问题不清楚,我很抱歉,我确实理解纹理和纹理单元之间的区别。如果 GL_MAX_TEXTURE_UNITS 大于我拥有的纹理数量,我可以将所有纹理映射到纹理单元中,并且完全避免在绘图期间使用 glBindTexture 调用吗? 当然可以,但您认为有什么好处。将所有纹理绑定到纹理单元将从它们中生成 GPU 样本。除非您停用单个纹理单元,在这种情况下,取消/绑定不会导致任何额外成本。绑定纹理或启用纹理单元的全部成本源于缓存失效。提高渲染性能的更好方法是按使用的材质和纹理状态对绘图操作进行排序,并将状态切换保持在最小值。并且禁用/启用纹理单元也有其成本。 @datenwolf:您的回答以及此处的染料/绘画类比 ***.com/questions/8866904/…(再次由您)让我了解了 OpenGL 中的纹理管理 :) 谢谢!【参考方案2】:

我认为,如果您要使用大量纹理,即上传到 GPU,您需要考虑一种方法来最大限度地减少 VRAM 的使用。在任何情况下,我认为可能对您有利的是 stb_dxt,它是用 ansi C 编写的 DXT1/DXT5 压缩器。您可以压缩纹理并使用 CompressedTexture2D 上传它们,这样您上传到 GPU 的所有纹理都需要 1 /8th 他们的正常空间。

在某些情况下,在运行时压缩所有纹理会减慢游戏的加载速度,这就是我建议使用 DDS 纹理的原因,您可以使用 nvidia-texture 工具在外部转换/管理纹理压缩。

【讨论】:

以上是关于OpenGL纹理管理的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES纹理

OpenGL-纹理(下)

opengl使用bmp纹理映射画不出东西

Windows 上的 OpenCL/OpenGL 纹理互操作:调整 OpenGL 纹理的大小

opengl 把纹理映射到立方体的六个面。

OpenGL-载入纹理