glReadPixels()“数据”参数用法?

时间:2012-01-12 19:55:26

标签: c++ opengl graphics

我正在尝试使用glReadPixels从图像中获取颜色数据。我应该使用glReadPixels,但我似乎无法搞清楚。它是一个更大的项目的一部分,但现在我想要的只是知道如何正确使用它。

我查了一下,得到了类似的东西:

    void glReadPixels(GLint x, 
       GLint y, 
       GLsizei width, 
       GLsizei height, 
       GLenum format, 
       GLenum type, 
       GLvoid* data);

但我不确定我应该在最后一个论点中加入什么,当我这样做时,我怎么会使用它。真的很感激帮助! (即:如何使用它或如何获得颜色的简单示例)

3 个答案:

答案 0 :(得分:17)

用法示例:

#include <GL/glut.h>
#include <vector>
#include <iostream>

using namespace std;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-10, 10, -10, 10, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glScalef(5,5,5);
    glBegin(GL_QUADS);
    glColor3ub(255,0,0);
    glVertex2f(-1,-1);
    glColor3ub(0,255,0);
    glVertex2f(1,-1);
    glColor3ub(0,0,255);
    glVertex2f(1,1);
    glColor3ub(255,255,255);
    glVertex2f(-1,1);
    glEnd();

    glutSwapBuffers();
}

void mouse( int x, int y )
{
    // 4 bytes per pixel (RGBA), 1x1 bitmap
    vector< unsigned char > pixels( 1 * 1 * 4 );
    glReadPixels
        ( 
        x, glutGet( GLUT_WINDOW_HEIGHT ) - y, 
        1, 1, 
        GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0] 
        );

    cout << "r: " << (int)pixels[0] << endl;
    cout << "g: " << (int)pixels[1] << endl;
    cout << "b: " << (int)pixels[2] << endl;
    cout << "a: " << (int)pixels[3] << endl;
    cout << endl;
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

    glutInitWindowSize(800,600);
    glutCreateWindow("glReadPixels()");

    glutDisplayFunc(display);
    glutPassiveMotionFunc(mouse);
    glutMainLoop();
    return 0;
}

使用鼠标获取像素的RGBA值。

答案 1 :(得分:17)

data获取一个指向您为glReadPixels准备的缓冲区的指针。像这样:

switch(format) {
case GL_BGR:
case GL_RGB:
    components = 3; break;

case GL_BGRA:
case GL_RGBA:
    components = 4; break;

case GL_ALPHA:
case GL_LUMINANCE:
    components = 1; break;
}

GLubyte *data = malloc(components * width * height);
if( data ) {
    glReadPixels(0, 0, width, height, format, GL_UNSIGNED_BYTE, data);
}

答案 2 :(得分:2)

data是指向您尝试读取的像素数据的指针。看看一些示例代码,然后查看上面上面几行调用以了解它们如何初始化它。通常它只是像x * y * depth这样的大小分配。你将它传递给&data。尝试读取已知颜色的1x1像素块并查看它返回的信息类型。