Размер 3D текстуры, влияющий на вывод программы без возникновения ошибки



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



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

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


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



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



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

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

1 ответ:

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

Comments

    Ничего не найдено.