我在某些ATI卡(Radeon X1650,X1550 +等)上遇到了一个棘手的问题.
消息是:"模块'atioglxx.dll'中地址6959DD46处的访问冲突'.读取地址00000000"
它出现在这一行:
glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_FLOAT,P);
Run Code Online (Sandbox Code Playgroud)
注意:
这是我到目前为止尝试过的(在代码中使用断言):
它通过所有那些测试,然后仍然失败的消息.
我觉得我已经尝试了一切,没有更多的想法.我真的希望这里的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)
您可能会处理 GL_PACK_ALIGNMENT。该参数告诉您打包纹理最接近的字节数。即,如果您有 645 像素的图像:
因此,通过执行以下操作来确保包值正确:
glPixelStorei(GL_PACK_ALIGNMENT, 1)
Run Code Online (Sandbox Code Playgroud)
在你的 glGetTexImage() 之前,或者在 GL_PACK_ALIGNMENT 上对齐你的内存纹理。