是否可以在 iPhone(2G 及更早版本)上使用 OpenGL ES 1.1 渲染到纹理?如果我将纹理绑定为渲染缓冲区,它必须是渲染缓冲区的大小,而不是 POT 大小。但是 OpenGL ES 1.1 要求纹理是 POT。
也许它不能在 ES 1.1 上完成?
是否可以在 iPhone(2G 及更早版本)上使用 OpenGL ES 1.1 渲染到纹理?如果我将纹理绑定为渲染缓冲区,它必须是渲染缓冲区的大小,而不是 POT 大小。但是 OpenGL ES 1.1 要求纹理是 POT。
也许它不能在 ES 1.1 上完成?
虽然 OpenGL ES 1.1 不支持非二次幂纹理,但较新的 iOS 设备型号具有扩展名GL_APPLE_texture_2D_limited_npot
,其中指出:
传统的 OpenGL ES 1.X 纹理仅限于具有二次方 (POT) 尺寸的图像。APPLE_texture_2D_limited_npot 扩展放宽了 2D 纹理的这些大小限制。如果支持,立方体贴图和 3D 纹理的限制仍然存在。
除了导出扩展字符串的实现将允许应用程序传入可能是也可能不是 2 的幂的 2D 纹理尺寸之外,此扩展没有引入额外的过程或枚举 API。
在没有解除这些限制的 OES_texture_npot 的情况下,除了 CLAMP_TO_EDGE 之外的 mipmapping 和 wrap 模式都不支持与 NPOT 2D 纹理结合使用。包裹模式不是 CLAMP_TO_EDGE 或 minfilter 不是 NEAREST 或 LINEAR 的 NPOT 2D 纹理被认为是不完整的。如果这样的纹理绑定到纹理单元,就好像该纹理单元的纹理映射被禁用。
您可以使用以下代码来确定您的设备是否支持此扩展(摘自 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 的下一个幂。
然后生成一个帧缓冲区:
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
它时,它将绘制到纹理。