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 回答