Размер 3D текстуры, влияющий на вывод программы без возникновения ошибки
Во-первых, я использую glDebugMessage() вместо glGetError() для определения ошибок.
Во-вторых, я выделяю хранилище 3D-текстур следующим образом:
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32F, 512, 512, 303, 0, GL_RGBA, GL_FLOAT, NULL);
Когда сопонент глубины равен 303 или меньше, моя программа работает точно так, как ожидалось (я выделяю цвет в текстуре и вижу этот цвет в качестве выходного), когда этот параметр равен 304 или выше, программа не работает (экран черный).
Я тестировал одну и ту же программу на разных машинах, и в зависимости от компьютера трешхолд меняется, иногда он выше, иногда ниже.
Моя гипотеза заключается в том, что некоторые драйверы не могут выделить достаточно памяти для обработки этой текстуры. Но никакой ошибки не возникает, или, по крайней мере, отладочное сообщение не вызывается.
Есть ли способ проверить, что я действительно запрашиваю больше памяти, чем может быть выделено, и как-то расширить указанную память?
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