2

いくつかの作業のためにglReadPixelsを使用していますが、奇妙な動作をしています。特に、次のテストを実行します。

unsigned char pixels[ 512 * 512 * 4 ];

int mid = 0;
while (mid < 512) {
  printf("Test %d : ", mid);
  memset(pixels, 0, 512*512*4);
  pixels[1] = 0x42;
  glReadPixels( 0, 0, mid, 511, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
  printf(" %x ", pixels[1]);
  if (pixels[0] == 0) {
    printf("0\n");
  } else {
    printf("1\n");
  }
  mid++;
}

出力あり:

Test 0 :  42 0
Test 1 :  67 1
Test 2 :  67 1
Test 3 :  67 1
Test 4 :  42 0
Test 5 :  67 1
Test 6 :  67 1
Test 7 :  67 1
Test 8 :  42 0
Test 9 :  67 1
Test 10 :  67 1
Test 11 :  67 1

すでに画面全体にデータを描画しているので(0x67は描画している色の正しいバイトです)、ここで何が起こっているのかわかりません。

私が実際に望んでいる主なことは、GPUではなくアクセスできる配列内の画面に現在表示されているすべてのピクセルのコピーを取得することです。これがそれを取得するための「正しい」方法であるかどうかはわかりませんが、私が知っている唯一の方法です。これを行うためのより良い方法はありますか?

4

1 に答える 1

0

このコードを使用して、最初に空のテクスチャを作成できます(更新ループの前に一度だけ使用してください)。

GLuint texID;

GLubyte *data = (GLubyte*)malloc(width*height*4*sizeof(GLubyte));
ZeroMemory(data,width*height*4*sizeof(GLubyte));

glGenTextures(1, (GLuint*)texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

次に、以下を使用して現在のバッファーをテクスチャにコピーします(これは、すべての更新ループの最後、バッファーを交換する直前に使用します)。

glBindTexture(GL_TEXTURE_2D,texID);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0);

そして最後にこれを使用して、RGBAピクセルデータ(前のビットの直後)を含む配列を取得します。

GLubyte *pixels = (GLubyte*)malloc(width*height*4*sizeof(GLubyte));
glBindTexture(GL_TEXTURE_2D,texID);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

もちろん、このピクセルデータで何をしたいかによります。これはまったく役に立たないかもしれませんが、私はそれが役立つことを願っています;)。

于 2012-12-17T02:45:23.793 に答える