glDrawPixels访问冲突读取位置

时间:2013-05-17 13:56:25

标签: c++ opengl rendering

我正在尝试使用OpenGL函数glDrawPixels()

渲染体积数据
#define SIZE    480
unsigned int    rgbPixels[SIZE][SIZE]
...
glDrawPixels(SIZE, SIZE, GL_RGB, GL_UNSIGNED_INT, rgbPixels);

如果我sizeof(rgbpixels),则返回921600,即480 * 480 * 4。

我试过GL_RGBA但没有好处。最后,我在屏幕上看到了一些内容而没有使用glDrawPixels(SIZE, SIZE*0.81, GL_RGB, GL_UNSIGNED_INT, rgbPixels);

进行访问冲突

但它不符合我的预期输出。在这种情况下,有人可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

您告诉glDrawPixels您的数据是SIZExSIZE像素,每个像素有3个组件(GL_RGB)32位无符号整数类型每个GL_UNSIGNED_INT)。如果rgbPixels不是这种情况(当你说它只是SIZE*SIZE*4而不是所需的SIZE*SIZE*3*4时可能不是这样),那么这可能会导致访问违规或其他未定义的行为。

如果您说rgbPixels的大小为SIZE*SIZE*4,那么我猜每个像素都包含4个字节,每个字节都是一个颜色组件。如果是这种情况,则需要

glDrawPixels(SIZE, SIZE, GL_RGBA, GL_UNSIGNED_BYTE, rgbPixels);

请记住glDrawPixels的所有参数都告诉OpenGL指针参数(rgbPixels)使用了多少内存以及它的布局格式。所以那些当然必须匹配rgbPixels包含(或指向)的实际内存。

答案 1 :(得分:1)

正如给定的OpenGL预计每个像素有3个无符号整数!您可能希望使用GL_UNSIGNED_INT_8_8_8_8作为数据类型。