glDrawPixels 访问冲突读取位置

Posted

技术标签:

【中文标题】glDrawPixels 访问冲突读取位置【英文标题】:glDrawPixels Access violation reading location 【发布时间】:2013-05-17 13:56:24 【问题描述】:

我正在尝试使用 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);

在屏幕上得到了一些东西而没有出现访问冲突

但这不是我预期的输出。那么在这种情况下有人可以帮助我吗?

【问题讨论】:

rgbPixels是什么类型? 【参考方案1】:

您告诉glDrawPixels,您的数据是SIZExSIZE 像素,每个像素有32 位无符号整数类型每个 (GL_UNSIGNED_INT) 的3 个分量(GL_RGB)。如果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 包含(或指向)的实际内存相匹配。

【讨论】:

你太棒了..不知道我怎么错过了..浪费了连续 3 个小时 我还要补充一句:“你到底为什么要使用 drawPixels()?”。 ;) 是的,我知道它很慢.. 但是还有其他选项可以在屏幕上绘制图像吗?我正在渲染体积数据,从文件中读取并重复绘制图像 @Adorn 是的,只需将纹理映射到屏幕大小的四边形上。事实上,现代 OpenGL(3+ 核心)不再有 glDrawPixels【参考方案2】:

鉴于 OpenGL 将期望每个像素有 3 个无符号整数!您可能希望使用GL_UNSIGNED_INT_8_8_8_8 作为数据类型。

【讨论】:

以上是关于glDrawPixels 访问冲突读取位置的主要内容,如果未能解决你的问题,请参考以下文章

选择PixelFormat 访问冲突读取位置

访问冲突读取位置和错误读取字符串的字符

访问dll方法时访问冲突读取位置

**** 访问冲突读取位置处未处理的异常 *******

访问冲突读取位置0x00000002 [关闭]

使用 ReadFile 时访问冲突读取位置