全屏纹理 iPhone OpenGL ES

5
我知道在iPhone上使用OpenGL纹理需要是2的幂次方,那么OpenGL 2.0也是这样吗?如果我有一张320 x 480大小的图片并想全屏绘制它,是否有可能使用OpenGL实现?
谢谢。
3个回答

8

PowerVR SGX硬件支持NPOT纹理,但有限制。NPOT纹理不能使用mipmaps,必须是2D(没有立方体贴图或3D纹理),并且必须在两个维度上使用GL_CLAMP_TO_EDGE进行纹理包裹;这在OpenGL ES 2.0中默认支持,在ES 1.1中通过扩展GL_APPLE_texture_2D_limited_npot支持。

对于ES 1.1,您可以使用以下代码在运行时检查是否存在此扩展:

const char* extensions = (char*) glGetString(GL_EXTENSIONS);
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0;

由于这仅存在于SGX而不是MBX上,因此请注意依赖NPOT纹理支持将限制您使用较新的SGX设备。当然,如果ES 2.0是您的目标,则同样适用,因此如果您打算使用NPOT纹理,则这一点并不重要。
下面是另一种解决方案,可以让您继续使用ES 1.1并保留完整的设备支持。将320x480纹理放入512x512中,使用其他背景瓷砖、字形或同时绘制的其他纹理填充空白(以避免多个glBindTexture调用),然后使用我最喜欢的ES 1.1扩展之一GL_OES_draw_texture,快速将320x480部分复制到视口中。
int rect[4] = {0, 0, 480, 320};
glBindTexture(GL_TEXTURE_2D, texBackground);
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
glDrawTexiOES(0, 0, z, 480, 320);

侧边栏:OpenGL ES 2.0规范本身并没有对NPOT纹理施加任何限制;除非我错了,否则是苹果公司强制限制——当然,在ES 1.1世界中,根本不存在NPOT支持,所以这是一个新增功能。

谢谢Chris,非常好的信息。不好意思,我是个新手,但是glDrawTexiOES()中的z参数是什么?深度吗?我似乎找不到任何文档。谢谢。 - user75832
@Ben:哎呀,对不起。Z是矩形的深度——0是近平面,1是远平面,小数值表示它们之间距离的百分比。在上面的例子中,它是用于严格的2D场景管理自己的深度,使用“画家算法”,所以z=0;对于大多数背景的使用,您将希望z=1,除非您已经反转了深度范围。OpenGL规范页面更好地解释了这一点:(http://www.khronos.org/registry/gles/extensions/OES/OES_draw_texture.txt - 页面中间)清楚明了吗? :) - user353161

0
假设您没有太多全屏纹理,您可以使用一个512x512的纹理,并且只使用其中的320x480。这肯定会起作用。

0

我想这取决于硬件。我曾经创建最接近2的幂次方纹理,例如如果我的纹理是320x480,那么我会创建一个512x512的纹理,其中包含原始纹理数据。这可以确保可移植性,但会消耗更多的内存;)


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