【问题标题】:OpenGL vers >=2.0 requires texture dimensions to be multiples of 4 pixels?OpenGL vers >=2.0 要求纹理尺寸是 4 像素的倍数?
【发布时间】:2011-01-28 14:56:41
【问题描述】:

我正在使用 OpenGL 纹理开发 Mac 应用程序,我使用 glTexImage2D 从磁盘上的图像文件加载。

根据文档,对于 OpenGL 版本 >= 2.0,纹理可以是任意大小。 (对于

但是,如果我的图像尺寸不是 4 的偶数倍,我的纹理会很差。我已经搜索和搜索,但找不到任何有关此要求的文档。事实上,“红皮书”明确指出纹理尺寸可以是版本 >= 2.0 的任何值。

我错过了什么?

而且,将纹理转换为下一个最大的二维幂是否会带来性能优势?我的应用程序需要 Mac OS 10.6.6 或更高版本,它应该可以在任何 Intel Mac 上运行。一些早期的英特尔 mac 具有非常“简陋”的图形硬件。

任何帮助将不胜感激。

【问题讨论】:

    标签: macos opengl textures glteximage2d


    【解决方案1】:

    对尺寸为 2 次方的普通纹理的约束在 OpenGL 版本 >= 2 中仍然存在。 但是支持 纹理目标,GL_TEXTURE_RECTANGLE,它支持任意尺寸,但不会做 mipmaping。

    对于尺寸为 4 的倍数没有限制,但是我怀疑您可能设置了 glPixelStore(GL_UNPACK...) 参数,可能由程序的其他部分设置,这会导致这种行为。

    【讨论】:

    • 这是不正确的。 OpenGL 2.0 引入了非幂的两种纹理。 GL_TEXTURE_RECTANGLE 也适用于 NPOT 纹理,但它仅限于非标准化坐标和无 mipmap,它是 OpenGL 3.x 的核心
    • +1 : glPixelStore(GL_UNPACK_ALIGNMENT, 1) 可能是你的朋友,如果你上传 RGB 纹理而不在每行末尾填充。
    • @Matias Valdenegro:谢谢,不知道。每天都要学习的东西。
    • @rotoglup 请发表您的评论作为答案,以便我投票。你拯救了我的一天:)
    【解决方案2】:

    你的纹理是什么格式的? S3TC 压缩纹理格式在 4x4 切片上运行,因此如果尺寸不是 4 的倍数,则可能无法正常工作或出现视觉伪影。

    【讨论】:

    • 我正在尝试编写代码,该代码将从磁盘以各种格式(JPEG、TIFF、PNG、GIFF)加载的任何 RGB 或 RGBA 图像创建纹理。Mac OS 擅长转换这些是一致的内部格式,然后我可以将其转换为纹理,除非将图像设置为正确的 4 倍数大小是一件令人头疼的事情。我尝试以 4 的倍数创建第二个图像并将我的第一个图像绘制到其中,但这会创建一个 NSCGImageSnapshotRep 类型的内部 NSImageRep(Cocoa 对象),它不允许我读取图像数据。有时我讨厌班级集群。
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2015-04-11
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多