我正在使用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上访问该数组。我不确定这是否是获得它的“正确”方式,但这是我所知道的唯一方式。有没有更好的方法呢?
答案 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);
这完全取决于你想用这个像素数据做什么。这可能对你没有帮助,但我希望它会;)。