对于我的图形类,我需要以像素完美的方式匹配OpenGL样本输出。
我想如果我能生成样本,发送一些输入,然后截取OpenGL区域的截图,对我的区域做同样的事情,然后比较这些截图,那将会很酷。我还认为像AutoIT这样的东西会是做这类事情最简单的方法。
我知道我可以使用屏幕截图功能,但我不确定如何获得窗口(不是标题栏/周围窗口的东西)的确切坐标和OpenGL区域的大小。
如果有人能帮我,那就太好了。或者,如果有人能想出一个比AutoIt更简单的解决方案,并能给我指出正确的方向,那就太好了。
编辑:我也没有访问示例输出程序的源代码。
AutoIt是这项工作的一个很好的工具。我想你已经在帮助文件中找到了_ScreenCapture,它有参数:X左,Y上,X右和Y下坐标。但是,_ScreenCapture函数存储到一个文件中。我创建了一个库,您可以在其中捕获部分屏幕或窗口,并将其保存到内存中。然后,您可以从内存中获取像素颜色,并将它们与现有像素进行比较。你可以在这里找到:http://www.autoitscript.com/forum/topic/63318-get-or-read-pixel-from-memory-udf-pixelgetcolor-au3/
窗口中不包括标题栏和边框的部分称为"客户区"。您可以使用WinGetClientSize获取客户区域的宽度和高度。或者,你可以在OpenGL控件上使用ControlGetPos来获取相对于窗口的X和Y,以及OpenGL控件的宽度和高度。结合WinGetPos,您应该能够计算_ScreenCapture所需的值。如果你使用"自动窗口信息"工具,你应该能够找到一个好的方法。
最后,一个简单而简短的解决方案,它给你很少的控制,但可能正是你需要的,是PixelChecksum函数。一旦你有了OpenGL部分的坐标,你就可以使用PixelChecksum并获得一个与屏幕像素相对应的值(像素的校验和)。然后,您可以将此值与预先录制的值进行比较,以判断屏幕上的像素是否完全相同。以PixelChecksum的Autoit帮助文件为例
如果你想从OpenGL缓冲区中捕获数据,这里是你如何使用旧的OpenGL(1.2版本或以上)
glFinish();
glReadBuffer(GL_FRONT);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glReadPixels(ox, oy, w, h, mode, GL_UNSIGNED_BYTE, img);
地点:
-
ox
和oy
为原点x和y -
w
为宽,h
为高 -
mode
是模式,如GL_BGR,如果你想保存为BMP -
img
是指向unsigned int *
的指针,用于将图像复制到
您可以在互联网上搜索glReadPixels
,并查看参考资料以获取更多信息。