在iPhone上渲染到非二次幂的纹理
是否可以在iPhone(2G及以上版本)上使用OpenGL ES 1.1进行纹理渲染? 如果我将纹理绑定为渲染缓冲区,则必须是不是POT大小的渲染缓冲区的大小。 但是OpenGL ES 1.1要求纹理是POT。
也许它不能在ES 1.1上完成?
虽然OpenGL ES 1.1不支持非GL_APPLE_texture_2D_limited_npot
纹理,但较新的iOS设备模型的扩展名为GL_APPLE_texture_2D_limited_npot
,其中规定:
传统的OpenGL ES 1.X纹理仅限于具有二次幂(POT)尺寸的图像。 APPLE_texture_2D_limited_npot扩展可以放宽2D纹理的这些大小限制。 如果支持立方体贴图和三维贴图,限制仍然存在。
除了导出扩展string的实现将允许应用程序传递二维纹理维度(可能是或不是二的幂)之外,没有其他过程或枚举API引入此扩展。
在没有提供这些限制的OES_texture_npot的情况下,除了CLAMP_TO_EDGE之外,不支持与NPOT 2D纹理结合的mipmapping或wrap模式。 带有不是CLAMP_TO_EDGE的包装模式的NPOT 2D纹理或不是NEAREST或LINEAR的微filter被认为是不完整的。 如果这样的纹理绑定到纹理单元,就好像该纹理单元的纹理映射被禁用。
您可以使用以下代码来确定您的设备是否支持此扩展(从Philip Rideout出色的iPhone 3D编程手册中获得):
const char* extensions = (char*) glGetString(GL_EXTENSIONS); bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0;
在这些设备上,只要设置了正确的纹理换行,就可以使用非二次幂的纹理:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
不幸的是, 这个示例应用程序使用了OpenGL ES 2.0,所以我不确定这会在这种情况下帮助你。
这是可以做到的,你所需要做的就是获得比非POT更大的下一个2的幂。
然后生成一个framebuffer:
GLuint aFramebuffer; glGenFramebuffersOES(1, &aFramebuffer);
和一个质地:
GLuint aTexturebuffer; glGenTextures(1, &aTexturebuffer);
然后,你做同样的纹理,如东西:
glBindTexture(GL_TEXTURE_2D, aTexturebuffer); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glColor4ub(0, 0, 0, 255); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); int area[] = {0.0, 0.0, renderWidth, renderHeight}; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, area); glBindFramebufferOES(GL_FRAMEBUFFER_OES, aFramebuffer); glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, aTexturebuffer, 0);
在这里我使用了draw_texture扩展。 textureWidth
和textureHeight
是2的大小, renderWidth
和renderHeight
是渲染的宽度和高度。 然后,当你绑定到一个aFramebuffer
它会画到纹理。