如何知道特定设备上的最大缓冲区存储大小(使用OpenGL)?

时间:2015-04-24 18:53:58

标签: opengl

我对响应问题的主题进行了一些研究:如何根据执行应用程序的设备(GPU)知道缓冲区(XXX缓冲区对象)可以包含的最大大小(以字节为单位)?

例如关于顶点存储我使用顶点缓冲对象(VBO),并且知道我是否可以分配特定大小的唯一方法是检查函数glGetError()是否返回错误GL_OUT_OF_MEMORY。因此,如果发生此异常,我将需要将其余数据存储在另一个VBO中(这显然与索引缓冲区对象(IBO)相同)。

现在,为了存储我的矩阵,我使用纹理缓冲区对象(TBO),对于我的材质和灯光参数,我使用统一缓冲区对象(UBO)。

关于TBO,它有一种了解最大尺寸的方法:定义值GL_MAX_TEXTURE_BUFFER_SIZE(纹理(或此处矩阵数据)最多只能访问GL_MAX_TEXTURE_BUFFER_SIZE纹素)。

因此,要知道最大存储大小(以字节为单位),我是否必须应用等式?

TBO(maxByteSize)= GL_MAX_TEXTURE_BUFFER_SIZE * sizeof(glm :: vec4)(我相信纹素是在32字节数组上定义的 - > glm :: vec4)。是吗?

我的设备如下:

GeForce GTX 780M(我有笔记本电脑)

以下是纹素中TBO最大大小的不同宏的值,以字节为单位转换的TBO最大大小以及UBO和SSBO的相同值:

std::cout << "TBO(texels): " << GL_MAX_TEXTURE_BUFFER_SIZE << std::endl;
std::cout << "TBO(bytes): " << GL_MAX_TEXTURE_BUFFER_SIZE * sizeof(glm::vec4)<< std::endl;
std::cout << "UBO: " << GL_MAX_UNIFORM_BLOCK_SIZE << std::endl;
std::cout << "SSBO: " << GL_MAX_SHADER_STORAGE_BLOCK_SIZE << std::endl;

输出:

TBO(texels): 35 883 texels
TBO(bytes): 574 128 bytes (0.5 MByte)
UBO: 35 376 bytes (0.03 MByte)
SSBO: 37 086 bytes (0.03 MByte)

但是我参考了以下网站:

http://rastergrid.com/blog/2010/01/uniform-buffers-vs-texture-buffers/

作者说UBO的最大大小至少为64 KB(65 536字节),对于TBO,该值至少为128 MB(134 217 728字节!)。

我也参考了以下网站(关于SSBO最大存储空间大小):

https://www.opengl.org/wiki/Shader_Storage_Buffer_Object

作者说SSBO的最大大小至少为16 MB(16 777 216字节)。

那么,我上面记录的信息出了什么问题?

这些宏是否包含以字节为单位的最大大小值?

1 个答案:

答案 0 :(得分:3)

你应该这样做:

GLint size;
glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &size);
std::cout << "GL_MAX_SHADER_STORAGE_BLOCK_SIZE is " << size << " bytes." << endl;

我的电脑输出是:

GL_MAX_SHADER_STORAGE_BLOCK_SIZE is 2147483647 bytes.