在OpenGL中计算按1d、2d、3d分组创建的纹理

Posted

技术标签:

【中文标题】在OpenGL中计算按1d、2d、3d分组创建的纹理【英文标题】:counting textures created grouping by 1d ,2d ,3d in OpenGL 【发布时间】:2013-09-23 08:59:22 【问题描述】:

gDebugger 向我展示了在应用程序中按维度分组创建的纹理。我还想计算在我的应用程序中从一开始创建的纹理数量以检查纹理泄漏。我没有看到任何 OpenGl 函数直接返回创建的纹理 id 的计数;计算应用程序中创建的纹理的最佳方法是什么?

【问题讨论】:

【参考方案1】:

没有可以批量执行的 GL 函数,但仅出于调试目的,您可以简单地遍历所有“可能”的 id(即数字),并通过 glIsTexture 进行检查:

const unsigned reasonably_big_value = 100000;
for (unsigned i = 0; i < reasonably_big_value; ++i) 
    if (glIsTexture(i)) 
       // count it somehow   
    

至少我知道,在运行时获取纹理维度是不可能的。 glGetTexLevelParameter 需要 target 参数,所以你自己来处理。

gDEBugger 充当中间人并跟踪所有 GL 调用 IIRC,因此它可以拥有自己的镜像纹理注册表。

【讨论】:

Do glGentexture Create texture with minimum free id? this code is used when glGentexture Create texture with minimum free id. 我认为这不是必需,但几乎所有实现都分配从 1 开始的连续数字。 我的问题是:如果我有例如 1、2、3、4、5 和删除 3,我可以确定下一个生成的 id 是 3 吗? 您必须自己检查,但这真的重要吗? glIsTexture 将在 3 上返回 false 如果它是空的,但你可以继续检查下一个数字。 如何测试纹理是什么类型? 2d, 3d 1d?使用这个 glgettexlevelparam 并为每个纹理传递 gl_texture_1d、_2d、_3d 作为目标(并以某种方式处理 gl_invalid_enum/操作错误)?

以上是关于在OpenGL中计算按1d、2d、3d分组创建的纹理的主要内容,如果未能解决你的问题,请参考以下文章

如何在opengl中计算给定3D点及其2D屏幕位置的投影/模型视图矩阵

OpenGL之Mipmap、压缩纹理

openGL 在运行时创建纹理图集?

如何在 1D 缓冲区中生成 2D 纹理并将其加载到 OpenGL 中?

OpenGL - 在 3D 世界的屏幕上固定位置打印 2D 文本

纹理在openGL中使用2D纹理映射3D对象