调用glGetTexImage时出错(atioglxx.dll)

Vil*_*nde 5 opengl

我在某些ATI卡(Radeon X1650,X1550 +等)上遇到了一个棘手的问题.

消息是:"模块'atioglxx.dll'中地址6959DD46处的访问冲突'.读取地址00000000"

它出现在这一行:

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_FLOAT,P);
Run Code Online (Sandbox Code Playgroud)

注意:

  • 安装了最新的图形驱动程序
  • 它适用于其他卡.

这是我到目前为止尝试过的(在代码中使用断言):

  • 指针P有效并分配足够的内存来保存图像
  • 纹理已启用:glIsEnabled(GL_TEXTURE_2D)
  • 测试当前绑定的纹理是我期望的纹理:glGetIntegerv(GL_TEXTURE_2D_BINDING)
  • 测试当前绑定的纹理是否具有我期望的尺寸:glGetTexLevelParameteriv(GL_TEXTURE_WIDTH/HEIGHT)
  • 测试没有报告错误:glGetError

它通过所有那些测试,然后仍然失败的消息.

我觉得我已经尝试了一切,没有更多的想法.我真的希望这里的GL-guru可以提供帮助!

编辑:

结束后它可能是我在这里发布的驱动程序错误:http://www.opengl.org/discussion_boards/ubbthreads.php? subb = showflat&Number = 295137# Post295137

我也尝试了GL_PACK_ALIGNMENT,它没有帮助.

通过一些更多的调查,我发现它只发生在我之前使用glCopyTexSubImage2D调用像素填充的纹理上.所以我可以通过调用glReadPixels然后调用glTexImage2D来替换glCopyTexSubImage2d调用来产生一种解决方法.

这是我更新的代码:

{
  glCopyTexSubImage2D cannot be used here because the combination of calling
  glCopyTexSubImage2D and then later glGetTexImage on the same texture causes
  a crash in atioglxx.dll on ATI Radeon X1650 and X1550.
  Instead we copy to the main memory first and then update.
}
//    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, PixelWidth, PixelHeight);  //**
GetMem(P, PixelWidth * PixelHeight * 4);
glReadPixels(0, 0, PixelWidth, PixelHeight, GL_RGBA, GL_UNSIGNED_BYTE, P);
SetMemory(P,GL_RGBA,GL_UNSIGNED_BYTE);
Run Code Online (Sandbox Code Playgroud)

tit*_*ito 1

您可能会处理 GL_PACK_ALIGNMENT。该参数告诉您打包纹理最接近的字节数。即,如果您有 645 像素的图像:

  • 将 GL_PACK_ALIGNMENT 设置为 4(默认值)时,您将拥有 648 像素。
  • 当 GL_PACK_ALIGNMENT 为 1 时,您将拥有 645 像素。

因此,通过执行以下操作来确保包值正确:

glPixelStorei(GL_PACK_ALIGNMENT, 1)
Run Code Online (Sandbox Code Playgroud)

在你的 glGetTexImage() 之前,或者在 GL_PACK_ALIGNMENT 上对齐你的内存纹理。