如何通过OpenGL编程访问显卡的视频内存,具体来说,获取所有内容的视频内存?
我尝试了以下两种方法,但都失败了.将它们连接起来,我希望你能指出我的程序中的错误或我对视频内存结构的理解.提前致谢!
我的基本想法是继续在视频内存中分配一个未初始化的区域,直到探索视频内存的所有内容.
(1)在main函数中,我创建了一个带有双缓冲区的窗口(参见下面的代码).
int main(int argc,char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); // double buffers
glutInitWindowPosition(0,0);
glutInitWindowSize(windowWidth, windowHeight);
glutCreateWindow("Hope to be successful!");
glutDisplayFunc(myDisplay); // call back function "myDisplay"
glutKeyboardFunc(keyboard);
glutMainLoop();
free(PixelData);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后,在"myDisplay"函数中,首先调用glReadPixels()函数从后面的帧缓冲区中读出给定大小的像素矩形,将这些像素信息保存在数组"PixelData"中,最后显示这些像素信息.通过调用glDrawPixels()函数来调整屏幕.执行此程序后,只显示一个黑色窗口.黑色是默认颜色.所以这意味着窗口什么都没有.然后我试图从后面的帧缓冲区中读取其他区域,并且它们都不包含任何内容.
从上面得出的结论是后框架缓冲器中不包含任何内容.但是,这是不合理的,因为前缓冲区应该只包含当前屏幕内容/窗口,因此在屏幕底部打开和最小化的其他窗口应该将其内容放在后面的帧缓冲区中,但后面的帧缓冲区是空的.那些存储了哪些窗口(由我在底部打开并最小化)?
我想为我的程序分配的帧缓冲区(后面和前面)只占整个视频内存的一小部分.因此,那些最小化的窗口内容应该存储在视频存储器的其他位置.
一段时间后,我阅读了OpenGL frameBuffer对象(FBO)的介绍,并且有一句话:默认情况下,OpenGL使用帧缓冲作为完全由窗口系统创建和管理的渲染目标.此默认帧缓冲区称为窗口系统提供的帧缓冲区.这似乎证实了我的上述猜测.
(2)然后我开始研究FBO,希望FBO可以帮助我探索整个视频内存.
在下面的main函数中,我创建了一个FBO和7个渲染缓冲对象(RBO),然后通过颜色附加点将这7个RBO附加到此FBO.
const int RBO_COUNT = 7; //how many renderBuffer objects are created to attach to the frameBuffer object
int main(int argc, char **argv)
{
....
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ALPHA); // display mode
...
// create a …Run Code Online (Sandbox Code Playgroud)