glReadPixels () использование аргумента "data"? - PullRequest
13 голосов
/ 12 января 2012

Я пытаюсь использовать glReadPixels для получения цветовых данных из изображения.Я должен был использовать glReadPixels, но я не могу понять это.Это часть гораздо большего проекта, но сейчас все, что я хочу, это знать, как правильно использовать это.

Я посмотрел на это и получил что-то вроде этого:

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

Но я не уверен, что мне следует указывать в качестве этого последнего аргумента, и когда я это сделаю, как я будудаже использовать его.Помощь действительно будет оценена!(т.е. простой пример того, как его использовать или как получить цвет)

Ответы [ 3 ]

18 голосов
/ 13 января 2012

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);
}
17 голосов
/ 13 января 2012

Пример использования:

#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 для пикселя.

2 голосов
/ 12 января 2012

data - указатель на данные пикселей, которые вы пытаетесь прочитать. Посмотрите на пример кода и посмотрите на несколько строк выше , которые вызывают, чтобы узнать, как они его инициализируют. Обычно это просто распределение размера, например, x * y * depth. Вы бы передали это как &data. Попробуйте прочитать блок 1x1 пикселей известного цвета и посмотрите, какую информацию он возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...