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

use*_*743 5 opengl

我对回答这个问题的主题做了一些研究:如何知道缓冲区(XXX缓冲区对象)可以包含的最大大小(以字节为单位),具体取决于执行应用程序的设备(GPU)?

\n\n

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

\n\n

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

\n\n

关于TBO,有一种方法可以知道最大尺寸:定义的值GL_MAX_TEXTURE_BUFFER_SIZE\xe2\x80\x8b(纹理(或这里的矩阵数据)最多只能访问GL_MAX_TEXTURE_BUFFER_SIZE\xe2\x80\x8b纹理像素)。

\n\n

那么,要知道最大存储大小(以字节为单位),我是否必须应用方程式?

\n\n

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

\n\n

我的设备如下:

\n\n

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

\n\n

以下是分别针对以纹素为单位的 TBO 最大大小、以字节为单位转换的 TBO 最大大小以及 UBO 和 SSBO 的不同宏的值:

\n\n
std::cout << "TBO(texels): " << GL_MAX_TEXTURE_BUFFER_SIZE << std::endl;\nstd::cout << "TBO(bytes): " << GL_MAX_TEXTURE_BUFFER_SIZE * sizeof(glm::vec4)<< std::endl;\nstd::cout << "UBO: " << GL_MAX_UNIFORM_BLOCK_SIZE << std::endl;\nstd::cout << "SSBO: " << GL_MAX_SHADER_STORAGE_BLOCK_SIZE << std::endl;\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
TBO(texels): 35 883 texels\nTBO(bytes): 574 128 bytes (0.5 MByte)\nUBO: 35 376 bytes (0.03 MByte)\nSSBO: 37 086 bytes (0.03 MByte)\n
Run Code Online (Sandbox Code Playgroud)\n\n

不过我参考了以下网站:

\n\n
http://rastergrid.com/blog/2010/01/uniform-buffers-vs-texture-buffers/\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
https://www.opengl.org/wiki/Shader_Storage_Buffer_Object\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

这些宏不包含最大大小值(以字节为单位)吗?

\n

小智 6

你应该这样做:

GLint size;
glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &size);
std::cout << "GL_MAX_SHADER_STORAGE_BLOCK_SIZE is " << size << " bytes." << endl;
Run Code Online (Sandbox Code Playgroud)

我电脑上的输出是:

GL_MAX_SHADER_STORAGE_BLOCK_SIZE is 2147483647 bytes.
Run Code Online (Sandbox Code Playgroud)