影响程序输出的3D纹理大小,不会引发错误

时间:2018-05-16 16:19:17

标签: c++ opengl memory graphics textures

首先,我使用glDebugMessage()代替glGetError()来确定错误。

其次,我按如下方式分配3D纹理存储:

glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32F, 512, 512, 303, 0, GL_RGBA, GL_FLOAT, NULL);

当深度组合为303或更小时,我的程序完全按预期工作(我在纹理中分配一种颜色,我将该颜色视为输出),当该参数为304或更高时,程序不会工作(屏幕是黑色的)。

我已经在不同的机器上测试了相同的程序,并且根据计算机的数据变化,有时它会更高,有时会更低。

我的假设是,某些驱动程序无法分配足够的内存来处理此纹理。但是没有抛出任何错误,或者至少调试消息没有被调用。

有没有办法可以验证我确实要求的内存多于可以分配的内存并以某种方式扩展内存?

1 个答案:

答案 0 :(得分:1)

如果我正确计算它,303纹理是~1.2GByte。但是你的gfx卡也需要内存用于帧缓冲和其他东西。遗憾的是,没有通用的GL API来查询可用内存。但是有一些扩展。这就是我在 OpenGL 引擎( VCL / C ++ )中查询基本信息的方式:

AnsiString OpenGLscreen::glinfo()
    {
    AnsiString txt="";
    txt+=glGetAnsiString(GL_VENDOR)+"\r\n";
    txt+=glGetAnsiString(GL_RENDERER)+"\r\n";
    txt+="OpenGL ver: "+glGetAnsiString(GL_VERSION)+"\r\n";
    if (ext_is_supported("GL_NVX_gpu_memory_info"))
        {
        GLint x,y,z;
        x=0; glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX,&x);
        y=0; glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX,&y);
        z=0; glGetIntegerv(GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX,&z);
        txt+=AnsiString().sprintf("GPU memory: %i/%i/%i MByte\r\n",x>>10,y>>10,z>>10); // GPU free/GPU total/GPU+CPU shared total
        x=0; glGetIntegerv(GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX,&x);
        y=0; glGetIntegerv(GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX,&y);
        txt+=AnsiString().sprintf("GPU blocks: %i used: %i MByte\r\n",x,y>>10);
        }
    if (ext_is_supported("GL_ATI_meminfo"))
        {
        GLint x0,x1,x2,x3; // free,largest available block,free auxiliary, largest available auxiliary
        x0=0; glGetIntegerv(GL_VBO_FREE_MEMORY_ATI,&x0);
        x1=0; glGetIntegerv(GL_VBO_FREE_MEMORY_ATI,&x1);
        x2=0; glGetIntegerv(GL_VBO_FREE_MEMORY_ATI,&x2);
        x3=0; glGetIntegerv(GL_VBO_FREE_MEMORY_ATI,&x3);
        txt+=AnsiString().sprintf("VBO memory: %i MByte\r\n",x0>>10);
        x0=0; glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI,&x0);
        x1=0; glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI,&x1);
        x2=0; glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI,&x2);
        x3=0; glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI,&x3);
        txt+=AnsiString().sprintf("TXR memory: %i MByte\r\n",x0>>10);
        x0=0; glGetIntegerv(GL_RENDERBUFFER_FREE_MEMORY_ATI,&x0);
        x1=0; glGetIntegerv(GL_RENDERBUFFER_FREE_MEMORY_ATI,&x1);
        x2=0; glGetIntegerv(GL_RENDERBUFFER_FREE_MEMORY_ATI,&x2);
        x3=0; glGetIntegerv(GL_RENDERBUFFER_FREE_MEMORY_ATI,&x3);
        txt+=AnsiString().sprintf("BUF memory: %i MByte\r\n",x0>>10);
        }
    return txt;
    }

因此,提取 nVidia ATI / AMD 内存查询。并移植到您的环境。