OpenGL纹理管理

3
我正在开发我的第一个游戏引擎:D。现在我正在处理纹理资源管理器,我希望能够做到最好。
直接填满驱动程序支持的所有ActiveTexture单元是否有任何不良影响?另一种选择是保留这些插槽,并仅在实际需要时设置纹理,但代价是更多的glBindTexture调用。

1
“slots”是什么意思?你只需将所需的纹理保留在内存中(最好只在必要时绑定),尝试避免调用,如果正确的纹理已经被绑定。 - Julio Gorgé
啊,抱歉。我指的是单位,而不是插槽。就是你用glActiveTexture(...)调用选择的那个东西 ;)。 - Hannesh
2个回答

5
你提出的问题让我觉得你对纹理对象(即纹理存储)和纹理单元(即多重纹理背后的机制)之间存在误解。
OpenGL有纹理对象和纹理单元。纹理对象保存数据,纹理单元将绑定到它们的纹理对象的数据映射到渲染过程中。
通常,人们将场景所需的所有纹理上传到纹理对象中。对于使用公共材质设置的每个渲染批次,将纹理绑定到正确的纹理单元以在渲染过程中使用。

如果我的问题不够清晰,我很抱歉。我确实理解纹理和纹理单元之间的区别。如果GL_MAX_TEXTURE_UNITS大于我拥有的纹理数量,那么我是否可以将所有纹理映射到纹理单元中,并避免在绘制过程中使用glBindTexture调用? - Hannesh
1
当然你可以这样做,但你认为有什么好处呢?将所有纹理绑定到纹理单元将使GPU从中采样。除非你禁用单个纹理单元,在这种情况下,解/绑定不会造成任何额外的开销。绑定纹理或启用纹理单元的整个成本源于缓存失效。提高渲染性能的一个更好的方法是按使用的材质和纹理状态对绘图操作进行排序,并将状态切换保持到最小。而启用/禁用纹理单元也有其成本。 - datenwolf
1
@datenwolf:您在此处提供的答案,以及您在https://dev59.com/Amox5IYBdhLWcg3w9o6h(同样是您)提出的染料/绘画比喻,让我理解了OpenGL中的纹理管理 :) 谢谢! - legends2k

2
我认为需要注意的是,如果你要使用大量纹理(例如上传到GPU),你需要考虑一种方法来最小化VRAM的使用。在任何情况下,我认为可能对你有益的是stb_dxt,它是一个用ansi C编写的DXT1 / DXT5压缩器。您可以使用CompressedTexture2D压缩您的纹理并将其上传,这样您上传到GPU的所有纹理都将占用正常空间的1/8。
在某些时候,运行时压缩所有纹理会减慢游戏的加载速度,因此我建议使用DDS纹理,您可以使用nvidia-texture工具来转换/管理纹理的压缩。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接