Размер 3D-текстуры влияет на вывод программы без ошибок - PullRequest
0 голосов
/ 16 мая 2018

Во-первых, я использую glDebugMessage() вместо glGetError() для определения ошибок.

Во-вторых, я выделяю хранилище 3D текстур следующим образом:

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

Когда компонент глубины равен 303 или менее, моя программа работает точно так, как ожидается (я выделяю цвет в текстуре и вижу этот цвет в качестве выходного), когда этот параметр равен 304 или выше, программа не работает ( экран черный).

Я тестировал одну и ту же программу на разных машинах, и в зависимости от компьютера порог меняется, иногда он выше, иногда ниже.

Моя гипотеза заключается в том, что некоторые драйверы не могут выделить достаточно памяти для обработки этой текстуры. Но не выдается никакой ошибки, или, по крайней мере, отладочное сообщение не вызывается.

Есть ли способ проверить, действительно ли я запрашиваю больше памяти, чем может быть выделено, и как-то расширить эту память?

1 Ответ

0 голосов
/ 17 мая 2018

Да, 303 текстура ~ 1,2 ГБ, если я правильно ее вычислю.Однако вашей карте памяти также требуется память для кадрового буфера и других вещей.К сожалению, нет единого 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 запросов к памяти.и перенести в вашу среду.

...