在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扩展。 textureWidthtextureHeight是2的大小, renderWidthrenderHeight是渲染的宽度和高度。 然后,当你绑定到一个aFramebuffer它会画到纹理。

    Interesting Posts