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 访问冲突读取位置的主要内容,如果未能解决你的问题,请参考以下文章