一旦在 OpenGL 或 DirectX 中运行时编译了顶点着色器,是否可以确定其在 GPU 内存中的占用空间?
在 OpenGL 中,您可以将
glGetProgramiv
与 GL_PROGRAM_BINARY_LENGTH
一起使用(文档此处)。这是 glGetProgramBinary
返回的程序长度 - 它可能无法反映 GPU 内存中的实际占用空间。
虽然我仍然很好奇为什么你需要这个,但我认为,只有驱动程序知道着色器二进制文件如何准确地上传到设备(哪些部分?何时?是否上传?一次或一个一个地上传所有着色器?)。无法通过 OpenGL 和 DirectX 等高级 API 来估计着色器的设备内存占用量。您甚至不知道它在哪个时间点到达设备内存。如果它真的得到了。
您仍然可以在 CPU 端获取二进制文件的大小,以了解我们正在讨论的数字。
ID3DBlob
方法,从 D3DCompile()
函数返回的 ID3DBlob::GetBufferSize()
查询二进制文件的大小。示例(为了清楚起见,省略了错误检查):
ID3DBlob* pBinary = 0;
D3DCompile(..., &pBinary, &pErrorMsgs);
size_t binarySize = pBinary->GetBufferSize();
glGetProgramiv()
函数与GL_PROGRAM_BINARY_LENGTH
一起使用,如GuyRT的答案中所述。示例(为了清楚起见,省略了错误检查):
GLint binarySize = 0;
glGetProgramiv(programId, GL_PROGRAM_BINARY_LENGTH, &binarySize);
希望有帮助!
不幸的是 - 截至我在 2024 年的测试 - 所有上述关于 GL_PROGRAM_BINARY_LENGTH 的建议都不再有效(至少在 Nvidia 硬件上)。每次都会收到“INVALID ENUMERANT”错误。