12

是否可以在 iPhone(2G 及更早版本)上使用 OpenGL ES 1.1 渲染到纹理?如果我将纹理绑定为渲染缓冲区,它必须是渲染缓冲区的大小,而不是 POT 大小。但是 OpenGL ES 1.1 要求纹理是 POT。

也许它不能在 ES 1.1 上完成?

4

2 回答 2

27

虽然 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,所以我不确定在这种情况下是否会对您有所帮助。

于 2011-01-21T16:51:42.623 回答
2

可以做到,你需要做的就是得到比非 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 扩展。 textureWidthtextureHeight是 2 的幂,renderWidth并且renderHeight是渲染器的宽度和高度。然后,当您绑定到aFramebuffer它时,它将绘制到纹理。

于 2011-01-21T15:32:11.030 回答