带屏幕像素的glReadPixels

时间:2017-06-19 15:35:37

标签: c++ windows opengl glreadpixels

我正在尝试读取屏幕像素的RGB值:

#include "stdafx.h"
#include<windows.h>
#include<stdio.h>
#include <gl\GL.h>

int main(int argc, char** argv)
{
    GLubyte color[3];
    glReadPixels(800, 800, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &color);

    printf("R:%d G:%d B:%d", color[0], color[1], color[2]);

    while (1);

}

但我要求的坐标无关紧要。它总是让我回复R:204 G:204 B:204

我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果没有当前的GL上下文,

glReadPixels()将无效。即使你确实有当前的上下文you can't read the system framebuffer that way

答案 1 :(得分:0)

正如其他答案和评论中所述,您只能对{strong> OpenGL 上下文窗口中当时实际呈现的像素使用glReadPixels ...正如您所提到的,您已经使用过GetPixel它暗示您正在使用 GDI 。在这种情况下,您尝试从 OpenGL 读取 GDI Canvas 像素,这是不可能的(反过来可能但反过来却很慢)。所以我建议阅读这个:

在哪里可以找到两种方法的示例。如果您尝试从自己的应用中获取像素,则可以使用不同的api,然后使用GetPixel

如果您位于 VCL 环境中,请使用Graphics::TBitmap::ScanLine属性,如果使用得当,该属性可用于直接像素访问而不受限制或性能命中。

GCC 环境的 MSVC ++ 上使用 WinAPI BitBlt但这有点慢而且不那么优雅(至少来自我的观点)。