我遇到某些ATI卡(Radeon X1650,X1550 +等)的难题。
消息是:“模块'atioglxx.dll'中地址6959DD46的访问冲突'。读取地址00000000”
它发生在这一行:
glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_FLOAT,P);
注意:
这是我到目前为止所尝试的(在代码中使用断言):
它通过了所有这些测试,然后仍然失败并显示消息。
我觉得我已经尝试了一切,没有更多的想法。我真的希望这里的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);
答案 0 :(得分:1)
您可以处理GL_PACK_ALIGNEMENT。此参数告诉您打包纹理的最接近字节数。即,如果您有645像素的图像:
通过执行以下操作,确保包装值正常:
glPixelStorei(GL_PACK_ALIGNMENT, 1)
在你的glGetTexImage()之前,或者在GL_PACK_ALIGNEMENT上对齐你的记忆纹理。
答案 1 :(得分:0)
这很可能是一个驱动程序错误。自己编写3D apis后,很容易就能看出来。您正在做一些非常奇怪且很少被测试覆盖的事情:在上传期间将浮点数据转换为8位。没有人会优化这条道路。你应该首先重新考虑你在做什么。通用转换cpu转换函数可能会在那里开始,有人搞砸了一个驱动临时缓冲区分配的表。您应该重新考虑使用内部8位格式的外部浮点格式。 GL api中的转换通常指向编程错误。如果您的数据是浮动的并且您希望保持这样,则应使用浮动纹理而不是RGBA。如果你想要8位,为什么你的输入浮动?