加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

opengl – 调用glGetTexImage时出错(atioglxx.dll)

发布时间:2020-12-14 02:19:07 所属栏目:Windows 来源:网络整理
导读:我在某些ATI卡(Radeon X1650,X1550和其他卡)上遇到了一个棘手的问题. 消息是:“模块’atioglxx.dll’中地址6959DD46处的访问冲突’.读取地址00000000” 它出现在这一行: glGetTexImage(GL_TEXTURE_2D,GL_RGBA,GL_FLOAT,P); 注意: 安装了最新的图形驱动程
我在某些ATI卡(Radeon X1650,X1550和其他卡)上遇到了一个棘手的问题.

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

它出现在这一行:

glGetTexImage(GL_TEXTURE_2D,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,PixelWidth,PixelHeight);  //**
GetMem(P,PixelWidth * PixelHeight * 4);
glReadPixels(0,PixelHeight,GL_UNSIGNED_BYTE,P);
SetMemory(P,GL_UNSIGNED_BYTE);

解决方法

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

>使用GL_PACK_ALIGNEMENT为4(默认值),您将拥有648像素.
>使用GL_PACK_ALIGNEMENT为1,您将拥有645像素.

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

glPixelStorei(GL_PACK_ALIGNMENT,1)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读