Использование аргументов glReadPixels() "data"?
Я пытаюсь использовать glReadPixels для получения цветовых данных из изображения. Я должен использовать glReadPixels, но я не могу понять это. Это часть гораздо более масштабного проекта, но сейчас я хочу только знать, как правильно это использовать.
Я просмотрел его и получил что-то вроде этого:
void glReadPixels(GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
GLvoid* data);
Но я не уверен, что мне следует включить в этот последний аргумент, и когда я это сделаю, как бы я его использовал. Помощь будет действительно оценена! (т.е. простой пример того, как его использовать или как получить цвет)
Ответы
Ответ 1
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
Пример использования:
#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 для пикселя.
Ответ 3
data
- это указатель на данные пикселя, которые вы пытаетесь прочитать. Взгляните на некоторый пример кода и посмотрите несколько строк выше этого вызова, чтобы узнать, как они инициализируют его. Обычно это будет просто распределение размера примерно как x * y * depth
. Вы передадите его как &data
. Попробуйте прочитать блок 1x1 пикселя известного цвета и посмотреть, какую информацию он возвращает.