宽度%4 == 0时,OpenGL glReadPixels不返回?

时间:2012-12-17 01:48:41

标签: opengl

我正在使用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上访问该数组。我不确定这是否是获得它的“正确”方式,但这是我所知道的唯一方式。有没有更好的方法呢?

1 个答案:

答案 0 :(得分: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);

这完全取决于你想用这个像素数据做什么。这可能对你没有帮助,但我希望它会;)。