2012-01-12 1 views
11

私はイメージからカラーデータを取得するためにglReadPixelsを使用しようとしています。私はglReadPixelsを使用するはずですが、私はそれを把握していないようです。これはもっと大きなプロジェクトの一部ですが、今私が望むのは、これを適切に使う方法を知ることだけです。glReadPixels() "data"引数の使用法ですか?

私はそれを見て、このようなものだ:

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

をしかし、私もそれを使用する方法を、私はその最後の引数として置くべきであるかわからないんだけど、私が行うとき。ヘルプは本当に感謝しています! (使用方法や色の取得方法の簡単な例)

+0

一度に画面全体の読み方の例:このようhttp://stackoverflow.com/a/36236839/895245 –

答えて

15

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

うまくやった。最初の2つのパラメータ(xとy)は、ピクセル領域の左下隅を指定するため、ほとんど常に0,0です。 – ahoffer

+0

GL_PACK_ALIGNMENTはどうですか?またはGL_PACK_ROW_LENGTH? – Zbyl

+0

@Zbyl:GL_PACK_ALIGNMENTは設定する必要がありますが、正確な値はターゲットフォーマットに依存します。 GL_PACK_ROW_LENGTHは、データが指すバッファのサブ部分を更新しない限り、0のままにすることができます。しかし、この全体像を読むだけでは、必要ではありません。 – datenwolf

2

dataは、読み込もうとしているピクセルデータへのポインタです。いくつかのコード例を見て、の上にあるより上の行を見て、それをどのように初期化しているか調べてください。通常は、それはちょうどx * y * depthのようなサイズの割り当てになります。あなたは&dataとしてそれを渡すでしょう。既知の色の1x1ピクセルブロックを読み取り、それがどのような情報を返すかを調べてみてください。

+0

「のデータは、あなたが読みしようとしているピクセルデータへのポインタです」 - 誤字:_write_、読み込みません。 – Damon

+0

私の言葉の順序は、何かが残っていると思います。「読みたいピクセルデータは 'data'に格納されています。彼らは*ピクセルを 'data'に読み込んでいます。 – Tim

16

使用例:

#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値を取得するには、マウスを使用してください。

+0

スリック!私はそれが好きです。 – Tim

+1

ベクトルの割り当て解除中にクラッシュしました。 'unsigned char pixels [4];' – num3ric

+0

このコードを実行しようとしていますが、得られるのはピクセルの空の(NULL)値だけです。これを引き起こしているのは何ですか?私はglut-3.7.6を使用しています。 – masad

関連する問題