Opengl 确定内存中已编译着色器的大小

Opengl 确定内存中已编译着色器的大小,opengl,memory,graphics,directx,shader,Opengl,Memory,Graphics,Directx,Shader,一旦在OpenGL或DirectX中编译了顶点着色器,是否可以确定其在GPU内存中的占用空间 在OpenGL中,您可以将glGetProgramiv与GL\u程序\u二进制长度(文档)一起使用。这是由glGetProgramBinary返回的程序长度-它可能不反映GPU内存中的实际占用空间。虽然我仍然好奇为什么您需要这个,但我认为,只有驱动程序知道着色器二进制文件是如何准确上传到设备的(哪些部分?何时?是否上载?一次上载所有着色器还是逐个上载?)。无法从OpenGL和DirectX等高级API估

一旦在OpenGL或DirectX中编译了顶点着色器,是否可以确定其在GPU内存中的占用空间

在OpenGL中,您可以将
glGetProgramiv
GL\u程序\u二进制长度
(文档)一起使用。这是由
glGetProgramBinary
返回的程序长度-它可能不反映GPU内存中的实际占用空间。

虽然我仍然好奇为什么您需要这个,但我认为,只有驱动程序知道着色器二进制文件是如何准确上传到设备的(哪些部分?何时?是否上载?一次上载所有着色器还是逐个上载?)。无法从OpenGL和DirectX等高级API估计着色器的设备内存占用。您甚至不知道它在什么时候到达设备内存。以及它是否真的得到了

仍然可以在CPU端得到二进制文件的大小,从而了解我们所讨论的数字

  • 在DirectX中,您可以通过调用函数的方法,从函数返回的二进制文件中查询二进制文件的大小。例如(为了清楚起见,省略了错误检查):

  • 在OpenGL中,您可以将函数与
    GL\u PROGRAM\u BINARY\u LENGTH
    一起使用,正如GuyRT的回答中所述。示例(为了清楚起见,省略了错误检查):


希望它有帮助!

你可能会发现线程很有用。事实上,我知道它是相当无用的信息。虽然我可以快速估计纹理的大小,但我不能使用着色器。我有理由加载数千个或更多。我更好奇我的上限可能是什么。这不是为了优化。我猜这是唯一的方法is是查询可用内存、加载着色器、查询可用内存和减法。因此,从这个意义上说,线程解决了它。着色器很可能是用中间语言编译的。当驱动程序或硬件发生变化时,最终二进制文件的大小可能会发生变化
ID3DBlob* pBinary = 0;
D3DCompile(..., &pBinary, &pErrorMsgs);
size_t binarySize = pBinary->GetBufferSize();
GLint binarySize = 0;
glGetProgramiv(programId, GL_PROGRAM_BINARY_LENGTH, &binarySize);