一旦你在OpenGL或DirectX中编译了运行时的顶点着色器,是否有可能确定它在GPU内存中的占用空间?
答案 0 :(得分:4)
在OpenGL中,您可以将glGetProgramiv
与GL_PROGRAM_BINARY_LENGTH
一起使用(文档here)。这是glGetProgramBinary
返回的程序长度 - 它可能无法反映GPU内存中的实际占用空间。
答案 1 :(得分:2)
虽然我仍然很好奇为什么你需要这个,我认为,只有驱动程序才知道shader二进制文件是如何上传到设备的(哪些部分?什么时候?它是上传的?所有着色器一次或一个-一?)。无法从高级API(如OpenGL和DirectX)估计着色器的设备内存占用量。你甚至不知道它到达设备内存的哪个时间点。如果它完全得到它。
仍然可以在CPU端获得二进制文件的大小,以了解我们正在谈论的数字。
在DirectX中,您可以通过调用ID3DBlob
方法查询D3DCompile()
函数返回的ID3DBlob::GetBufferSize()
二进制文件的大小。示例(为清楚起见省略了错误检查):
ID3DBlob* pBinary = 0;
D3DCompile(..., &pBinary, &pErrorMsgs);
size_t binarySize = pBinary->GetBufferSize();
在OpenGL中,您可以将glGetProgramiv()
函数与GL_PROGRAM_BINARY_LENGTH
一起使用,如GuyRT的回答中所述。示例(为清楚起见省略了错误检查):
GLint binarySize = 0;
glGetProgramiv(programId, GL_PROGRAM_BINARY_LENGTH, &binarySize);
希望它有所帮助!