我知道iphone上的OpenGL纹理需要2的强度,这对OpenGL 2.0也是如此吗?如果我有一个尺寸为320 x 480的图像并想要全屏绘制,那么有可能用OpenGL做这个。
由于
答案 0 :(得分:9)
PowerVR SGX硬件支持NPOT纹理 ,但有限制。 NPOT纹理不能使用mipmap,必须是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支持是一个没有实际意义的点,你可以继续使用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纹理指定任何限制;除非我弄错了,Apple正在施加限制 - 当然,在ES 1.1世界中,NPOT支持根本不存在,所以它是一个补充。
答案 1 :(得分:1)
假设您没有太多的全屏纹理,您可以使用512x512
纹理并仅使用320x480
纹理。它肯定会奏效。
答案 2 :(得分:1)
我想这取决于硬件。我曾经创造了2纹理的最接近的力量,即如果我的纹理是320x480,那么我将创建512x512的纹理,它将具有原始纹理数据。这确保了可移植性,但消耗了更多的内存;)