NKa*_*tUT 2 c++ windows opengl
我正在使用双缓冲在任意已打开的Windows 7窗口(例如Windows记事本窗口)中绘制Open GL内容(直接Win32 - 不使用GLUT,FreeGLUT,GLFW等).我有窗口句柄,可以按预期绘制我想要的内容,但我看到该glClear()功能的奇怪行为.
我的理解是,该glClear()功能应该只影响屏幕上由glScissor()功能定义的区域内的像素.我已经定义了剪刀区域,glScissor()然后启用了剪刀功能glEnable(GL_SCISSOR_TEST).glClearColor设置为白色(0,0,0,1).我正在用glClear()命令清除颜色和深度缓冲区.
当SwapBuffers()命令以呈现在屏幕上被执行时,我选择了白色的清澈颜色被涂成剪刀区域内,因为我的要求,但窗口的其余部分OUTSIDE剪刀区域被涂成黑色,而不是把这些像素不变的我期望.
正如图中所示,剪刀区域(白色)和对象(3D立方体)的正确绘制,但记事本窗口的像素的其余部分设置为黑色,以前在记事本窗口中画任何东西覆盖了.
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // white background
glViewport(0, 0, 300, 300);
glScissor(0, 0, 250, 400);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//... draw cube inside glBegin()/glEnd()...
SwapBuffers(hDC);
Run Code Online (Sandbox Code Playgroud)
如果我正确地得到您的描述,glClear按预期工作.
你不能假设只是因为你在屏幕上看到某些东西,它也存在于后台缓冲区中.您看到的记事本窗口的内容是前缓冲区,或前缀缓冲区的副本,该缓冲区被嵌入到DWM自己的秘密渲染缓冲区中(取决于您是否具有合成).或者,其他东西,一个GDI缓冲区,它被blit到DWM的缓冲区,或者其他.最有可能是后者,因为它使用GDI进行渲染.
当你翻转缓冲区,将显示在任何屏幕上的该REGIN后台缓存,和你得到的是一个全黑的缓冲(实际上未初始化的,但据推测司机是这么好心零内存)除你清除白色的区域.
这正是你应该期待的 - 你glClear只受影响的一个子区域,其余的是未定义的,它恰好是零(黑色).
Incidentially,如果没有合成已启用 ,你可以看到在屏幕上可以从前台缓冲区,可以在大多数图形卡的后台缓冲区被复制,这样你就可以依然看到记事本窗口的原始内容,如果你希望有就这样.然而,你将永远不会有一个GDI窗口中的内容在你的背部缓冲神奇(也不会与DWM这项工作,也不是什么事情,工作有保证,它只能incidentially大部分时间).
如果你想要窗口的原始内容,干净的解决方案将是BitBlt从DC到内存,创建纹理,并将一个绘制(或blit)到后台缓冲区.