0

基本上,在我的代码中,我挂钩了 glDeleteTextures 和 glBufferData 函数。我存储了一个纹理列表和一个缓冲区列表。缓冲区列表包含校验和和指向缓冲区的指针。下面的代码在数据到达显卡之前拦截数据。

Hook_glDeleteTextures(GLsizei n, const GLuint* textures)
{
    for (int I = 0; I < n; ++I)
    {
        if (ListOfTextures[I] == textures[I])       //??? Not sure if correct..
        {
            //Erase them from list of textures..
        }
    }

    (*original_glDeleteTextures)(n, textures);
}

我对缓冲区做同样的事情。我将缓冲区和纹理保存到如下列表中:

void Hook_glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
{
    Buffer.size = size;
    Buffer.target = target;
    Buffer.data = data;
    Buffer.usage = usage;

    ListOfBuffers.push_back(Buffer);
    (*original_glBufferData(target, size, data, usage);
}

现在我需要在客户端删除时删除。我怎样才能做到这一点?我使用了一个调试器,它似乎确切地知道哪些纹理和缓冲区正在被删除。

我做错了吗?我应该迭代传递的指针并删除纹理吗?

4

1 回答 1

1

你确实意识到,你应该反过来:拥有一个纹理信息对象列表,当你删除其中一个时,调用 OpenGL 来删除纹理。顺便说一句:OpenGL 调用不会转到显卡,它们会转到驱动程序,并且纹理可能根本不存储在 GPU 内存上,而是被换出到系统内存。

我做错了吗?我应该迭代传递的指针并删除纹理吗?

是的。您不应拦截 OpenGL 调用来触发程序中的数据管理。一方面,您还必须跟踪活动的 OpenGL 上下文。但更重要的是,首先执行 OpenGL 调用的是您的程序。除非您的程序/编译器/CPU 是精神分裂症,否则首先跟踪数据并根据此管理 OpenGL 对象应该更容易。通常的方法是将纹理图像数据保存在缓存中,但删除这些图像的 OpenGL 纹理,如果您现在不需要它们,但在不久的将来可能需要它们。

你的方法基本上是由内而外的,你本末倒置。

于 2012-12-18T09:29:45.143 回答