调用glGetTexImage时出错(atioglxx.dll)

时间:2011-04-06 09:31:59

标签: opengl

我遇到某些ATI卡(Radeon X1650,X1550 +等)的难题。

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

它发生在这一行:

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_FLOAT,P);

注意:

  • 安装了最新的图形驱动程序。
  • 它在其他卡上完美运行。

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

  • 指针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?ubb=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);

2 个答案:

答案 0 :(得分:1)

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

  • 使用GL_PACK_ALIGNEMENT为4(默认值),您将拥有648像素。
  • 如果GL_PACK_ALIGNEMENT为1,则您将拥有645像素。

通过执行以下操作,确保包装值正常:

glPixelStorei(GL_PACK_ALIGNMENT, 1)

在你的glGetTexImage()之前,或者在GL_PACK_ALIGNEMENT上对齐你的记忆纹理。

答案 1 :(得分:0)

这很可能是一个驱动程序错误。自己编写3D apis后,很容易就能看出来。您正在做一些非常奇怪且很少被测试覆盖的事情:在上传期间将浮点数据转换为8位。没有人会优化这条道路。你应该首先重新考虑你在做什么。通用转换cpu转换函数可能会在那里开始,有人搞砸了一个驱动临时缓冲区分配的表。您应该重新考虑使用内部8位格式的外部浮点格式。 GL api中的转换通常指向编程错误。如果您的数据是浮动的并且您希望保持这样,则应使用浮动纹理而不是RGBA。如果你想要8位,为什么你的输入浮动?