是的,如果我计算正确的话,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;
}
所以提取
英伟达
和
ATI/AMD
内存查询。并将其移植到您的环境中。
顺便说一句,我刚刚意识到,为了使上述代码正常工作,您还需要:
AnsiString glGetAnsiString(GLuint id)
{
GLubyte a,*p=(GLubyte*)(void*)glGetString(id);
AnsiString s;
for(s="";p;p++)
{
a=p[0];
if (!a) break;
s+=char(a);
}
return s;
}
它只是转换的结果
glGetString
从…起
char*
至VCL
AnsiString
我经常使用它。所以在不同于VCL的环境中
char字符*
或者转换为字符串类型。。。