tutorial proyectos figuras example ejemplos cubo c++ opengl graphics

c++ - proyectos - opengl tutorial



glReadPixels() uso de argumentos "de datos"? (3)

data es el puntero a los datos de píxeles que intenta leer. Eche un vistazo a algún código de ejemplo y mire algunas líneas arriba de esa llamada para averiguar cómo lo están inicializando. Usualmente será una asignación de tamaño algo como x * y * depth . Lo pasarías como &data . Intente leer un bloque de 1x1 píxeles de color conocido y vea qué tipo de información le devuelve.

Estoy tratando de usar glReadPixels para obtener datos de color de una imagen. Se supone que debo usar glReadPixels, pero parece que no puedo resolverlo. Es parte de un proyecto mucho más grande, pero ahora todo lo que quiero es saber cómo usar esto correctamente.

Lo busqué y obtuve algo como esto:

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

Pero no estoy seguro de qué debería incluir como último argumento, y cuando lo haga, cómo lo utilizaría. ¡La ayuda realmente sería apreciada! (es decir: un ejemplo simple de cómo usarlo, o cómo obtener el color)


data toma un puntero a algún buffer que preparó para glReadPixels para poner los datos. Me gusta esto:

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); }


Ejemplo de uso:

#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; }

Use el mouse para obtener el valor de RGBA para un píxel.