OpenGL版本>=2.0需要纹理尺寸为4像素的倍数吗?

5
我正在开发一款使用OpenGL纹理的Mac应用程序,我使用glTexImage2D从磁盘上的图像文件中加载纹理。
根据文档,在OpenGL版本>= 2.0时,纹理可以是任意大小。 (对于版本<2.0,x和y维度都必须是2的幂。)
然而,如果我的图像尺寸不是4的倍数,则会出现纹理失真的问题。 我已经搜索了很多,但找不到关于这个要求的任何文档。 实际上,“红皮书”明确说明,对于版本> = 2.0,纹理维度可以是任何值。
我错过了什么?
将纹理转换为下一个最大的2的幂维度是否具有性能优势? 我的应用将需要Mac OS 10.6.6或更高版本,这应该适用于任何Intel Mac。 一些早期的Intel Mac具有非常“卑微”的图形硬件。
非常感谢任何帮助。
2个回答

5

在OpenGL版本>=2中,普通纹理的尺寸仍然需要是2的幂次方。 但是,现在支持一种新的纹理目标GL_TEXTURE_RECTANGLE,它支持任意尺寸,但不支持mipmaping。

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


3
不正确。OpenGL 2.0引入了非二次幂纹理。GL_TEXTURE_RECTANGLE也适用于NPOT纹理,但它限制在未归一化坐标和无mipmap,并且它是OpenGL 3.x核心的一部分。 - Dr. Snoopy
6
如果您上传没有在每行末尾填充的RGB纹理,那么+1 : glPixelStore(GL_UNPACK_ALIGNMENT,1)可能会对您有帮助。 - rotoglup
@Matias Valdenegro:谢谢,我不知道那个。每天都有东西可以学习。 - datenwolf
@rotoglup请将您的评论发布为答案,这样我就可以点赞了。你救了我的一天 :) - kaoD

0
你的纹理是什么格式?S3TC压缩纹理格式基于4x4的瓷砖操作,因此如果尺寸不是4的倍数,则可能无法正常工作或会出现视觉伪影。

我正在尝试编写代码,从磁盘加载各种格式(JPEG、TIFF、PNG、GIFF)的RGB或RGBA图像,并创建纹理。Mac OS可以将它们转换为一致的内部格式,然后我可以将其转换为纹理,但是将图像调整为正确的4的倍数大小却很棘手。我尝试创建一个二次元素大小为4的倍数的图像,并将第一个图像绘制到其中,但这会创建一个NSCGImageSnapshotRep类型的内部NSImageRep(Cocoa对象),不允许我读取图像数据。有时我讨厌类群。 - Duncan C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接