glGetTexImage() 在 ATI 卡上不能正常工作?当 miplevel > 0 时失败

Posted

技术标签:

【中文标题】glGetTexImage() 在 ATI 卡上不能正常工作?当 miplevel > 0 时失败【英文标题】:glGetTexImage() doesnt work properly on ATI cards? fails when miplevel > 0 【发布时间】:2010-02-02 22:07:06 【问题描述】:

我使用该函数从显卡获取纹理, 但由于某种原因,如果 miplevel > 0

,它不会在某些卡上返回任何内容

这是我用来获取图像的代码:

glGetTexImage(GL_TEXTURE_2D, miplevel, GL_RGB, GL_UNSIGNED_BYTE, data);

这是我用来检查 mipmapping 使用哪种方法的代码:

ext = (char*)glGetString(GL_EXTENSIONS);

if(strstr(ext, "SGIS_generate_mipmap") == NULL)
 // use gluBuild2DMipmaps()
else
 // use GL_GENERATE_MIPMAP

到目前为止它工作正常,所以它说下面的 ATI 卡支持 GL_GENERATE_MIPMAP。

这是经过测试的卡片:

    ATI Radeon 9550 / X1050 系列 ATI Mobility Radeon HD 3470 ATI Radeon X700 ATI Radeon HD 4870 ATI Radeon HD 3450

此时我正在使用 miplevel 0 并通过自己的代码生成 mipmap。有没有更好的解决方法?

glGetError() 也为所有卡片返回 0,因此不会发生错误。它只是不起作用。可能是驱动问题?

我仍在寻找比自己在 CPU 上调整大小更好的解决方法...

【问题讨论】:

glGetError() 是否返回任何有用的信息? “旧卡”到底是什么意思? 1998 年左右曾经有不完整的 OpenGL 实现(例如 Matrox G200 OpenGL MCD),但如果你不告诉我们更多关于它们的信息(包括驱动程序和操作系统版本),很难说这是否适用于你的显卡。 您是如何生成 mipmap 的? gluBuild2DMipmaps() 或 glTexParameteri(..., GL_GENERATE_MIPMAP, ...)? gluBuild2DMipmaps() 如果不支持 GL_GENERATE_MIPMAP。并且所有这些卡片都可以看到 mipmap 的地形,所以它不会丢失 mipmap。 纹理是用 GL_RGB 格式创建的吗?此外,当 miplevel = 0 时它是否有效? “我注意到该功能确实有效”似乎意味着如此,但我不太确定。 它适用于 miplevel 0 是的。并且格式没有区别,我也尝试过使用 GL_RGBA,同样的问题。纹理是用 GL_RGBA 格式创建的。 【参考方案1】:

检查 glGetTexImage 报告的错误。它很可能会告诉您错误是什么。

编辑:听起来像是使用 ATI 编写不佳的 OpenGL 驱动程序的乐趣。假设您的驱动程序是最新的,请使用 nVidia 卡,解决它或接受它不起作用。那几乎是你唯一的选择。可能值得为 ATI 麻烦,但他们很可能什么都不做,唉。

Edit2:在问题卡上,您是否使用 GL_GENERATE_MIPMAP?除非明确构建,否则您可能无法获取 mip 级别...?即尝试 gluBuild2DMipmaps() 的一切。

编辑 3:事情是这样的。它“可能”是您的问题的原因。在我看来,ATI 卡从本地副本中获取纹理似乎不太可能,但是如果您使用自动生成的 mip 贴图,那么它会完全在卡上完成并且永远不会将它们复制回来。明确地尝试在本地构建 mip 映射,看看是否能解决您的问题。可能不会,但是您确实需要尝试这些事情,否则您将永远无法解决问题。唉,反复试验就是解决此类问题的全部方法。这就是为什么很少有游戏拥有包含驱动程序名称、卡名称和驱动程序版本的大型数据库来决定某个功能是否有效的原因。

【讨论】:

答案不是要求澄清,这就是 cmets 的目的。 有什么方法可以检查它们是否支持 miplevel > 0 纹理抓取?所以我不必告诉用户手动更改某些设置。 ive 让它根据是否支持来选择使用哪种方法。所以我看不出有什么理由去尝试(那些不是我的电脑),因为它不会解决任何问题。如果您认为有一些解决方法,那么请让我听听可能性。看看我的编辑,我展示了用于检查对它的支持的代码。 但是有问题卡的用户可以看到miplevels!所以它不会丢失 miplevel 问题... 响应缓慢,但您可以尝试一下,看看是否可以找出错误是什么,或者您可以假设一切正常(它不会......驱动程序通常不完整或越野车)

以上是关于glGetTexImage() 在 ATI 卡上不能正常工作?当 miplevel > 0 时失败的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:旧 ATI 卡上的“硬件不支持片段着色器”

为啥 onload 事件在使用 window.open 打开的选项卡上不起作用?

无法使用 glGetTexImage 读取深度图纹理

检测到堆栈粉碎 glGetTexImage

在 nvidia opengl 上混合 glGetTexImage 和 imageStore 的问题

使用 glTexImage2D 和 glGetTexImage 的一些问题