C++ glDeleteTextures和glDeleteBuffers是如何工作的?

C++ glDeleteTextures和glDeleteBuffers是如何工作的?,c++,opengl,C++,Opengl,基本上,在我的代码中,我钩住了glDeleteTextures和glBufferData函数。我存储纹理列表和缓冲区列表。缓冲区列表包含校验和以及指向缓冲区的指针。下面的代码在数据到达图形卡之前拦截数据 Hook_glDeleteTextures(GLsizei n, const GLuint* textures) { for (int I = 0; I < n; ++I) { if (ListOfTextures[I] == textures[I])

基本上,在我的代码中,我钩住了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);
}
现在,每当客户端删除时,我都需要删除。我该怎么做?我使用了调试器,它似乎确切地知道哪些纹理和缓冲区正在被删除


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

您确实意识到,您应该反过来:有一个纹理信息对象列表,当您删除其中一个对象时,调用OpenGL删除纹理。顺便说一句:OpenGL调用不会进入图形卡,而是进入驱动程序,纹理可能根本不会存储在GPU内存中,而是会交换到系统内存中

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

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


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

你有多确定织物和纹理的排列顺序是相同的?如果它们的顺序不一样,if语句就不起作用。你知道,你应该反过来说:有一个纹理信息对象的列表,当你删除其中一个对象时,调用OpenGL来删除纹理。顺便说一句:OpenGL调用不会进入图形卡,而是进入驱动程序,纹理可能根本不会存储在GPU内存中,而是被交换到系统内存中。这就是问题所在。这是一个“钩子”。我正在勾引别人的游戏,并获得纹理。我只想删除他们正在删除的内容。@CantChooseServerNames:这些钩子的目的是什么?您是否跟踪OpenGL上下文绑定,以及上下文是否共享纹理?所有必须考虑的事情。钩子看起来像:目的只是从游戏中获取信息并使用它。上下文绑定?@CantChooseServerNames:是上下文绑定。纹理对象是每个上下文(或共享纹理对象的上下文组之间)的对象。一个程序有多个OpenGL上下文,每个都有自己的纹理ID名称空间。我学到了一些新东西。据我所知,它没有共享任何纹理。
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);
}