全屏纹理iPhone OpenGL ES

全屏纹理iPhone OpenGL ES,iphone,opengl-es,Iphone,Opengl Es,我知道iphone上的OpenGL纹理必须是2的幂,OpenGL 2.0也是这样吗?如果我有一个320 x 480大小的图像,并且想把它画成全屏,有没有任何可能的方法可以用OpenGL来做到这一点 谢谢假设你没有太多的全屏纹理,你可以只使用512x512纹理,只使用320x480。它肯定会工作。我想这取决于硬件。我曾经创建过最接近的2次幂纹理,即如果我的纹理是320x480,那么我将创建一个512x512的纹理,它将包含原始纹理数据。这确保了可移植性,但会消耗更多的内存;) PowerVR SG

我知道iphone上的OpenGL纹理必须是2的幂,OpenGL 2.0也是这样吗?如果我有一个320 x 480大小的图像,并且想把它画成全屏,有没有任何可能的方法可以用OpenGL来做到这一点


谢谢

假设你没有太多的全屏纹理,你可以只使用
512x512
纹理,只使用
320x480
。它肯定会工作。

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

PowerVR SGX硬件支持NPOT纹理,但有限制。NPOT纹理不能使用mipmap,必须是2D(无立方体贴图或3D纹理),并且必须使用
GL\u CLAMP\u TO\u EDGE
在两个维度中进行纹理包裹;默认情况下,OpenGL ES 2.0和ES 1.1中的扩展
GL\u APPLE\u texture\u 2D\u limited\u 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支持是一个没有实际意义的点,您可以继续使用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);

侧栏:OpenGLES2.0规范本身没有对NPOT纹理指定任何限制;除非我弄错了,否则苹果正在施加限制——当然,在ES 1.1世界中,NPOT支持根本不存在,因此它是一个新增功能。

谢谢Chris,非常好的信息。请原谅我是一个noob,但是glDrawTexiOES()中的z参数是什么?深度我似乎找不到任何文件。Thanks@Ben:哎呀,对不起。Z是矩形的深度-0是近平面,1是远平面,十进制值给出它们之间的距离百分比。在上面的例子中,这是一个严格的2D场景,使用“画家算法”管理自己的深度,因此z=0;对于大多数背景的使用,除非已经反转了深度范围,否则需要z=1。OpenGL规范页面的布局稍微好一点:(-大约在页面的一半)清晰如泥?:)