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

标签 opengl

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

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

现在,为了存储我的矩阵,我使用纹理缓冲区对象 (TBO),对于我的 Material 和灯光参数,我使用统一缓冲区对象 (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 MBytes(134 217 728 字节!)。

我还引用了以下网站(关于 SSBO 最大存储大小):

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

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

那么,我上面记录的信息有什么问题吗?

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

最佳答案

你应该这样做:

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.

关于opengl - 如何知道特定设备上的最大缓冲区存储大小(使用 OpenGL)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29855353/

相关文章:

c++ - glInterleavedArrays() 生成 GL_INVALID_FRAMEBUFFER_OPERATION

c - glColor4f() - alpha 值的影响

c - glVertexArrays,越界。索引无效

opengl - 立方体贴图时OpenGL旋转纹理的原因是什么?

java - 实现套索选择

c++ - 在opengl中删除纹理

linux - “glSwapInterval”未在此范围内声明

c++ - 在C++中默认情况下结构体的内存是如何排列的?

c++ - X11 和 nVidia 驱动程序的奇怪 EGL 行为

opengl - 为什么这个 GLSL Vertex Shader 不能编译?