是否可以在iPhone(2G及更早版本)上使用OpenGL ES 1.1渲染纹理?如果我将纹理绑定为渲染缓冲区,那么它必须是不是POT大小的渲染缓冲区的大小。但是OpenGL ES 1.1需要纹理为POT。在iPhone上渲染到非二次幂的纹理
也许它不能在ES 1.1上完成?
是否可以在iPhone(2G及更早版本)上使用OpenGL ES 1.1渲染纹理?如果我将纹理绑定为渲染缓冲区,那么它必须是不是POT大小的渲染缓冲区的大小。但是OpenGL ES 1.1需要纹理为POT。在iPhone上渲染到非二次幂的纹理
也许它不能在ES 1.1上完成?
它可以做到,你所需要做的就是获得比非POT更大的下一个功率。
然后生成一个帧缓冲:
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
是rendere的宽度和高度。 然后当你绑定到aFramebuffer
它会画到纹理。
虽然OpenGL ES的1.1不支持非幂的两个纹理,更新iOS设备模型的扩展GL_APPLE_texture_2D_limited_npot
,其中指出:
常规的OpenGL ES 1.X纹理 被限制为图像两个幂的 (POT)尺寸。 APPLE_texture_2D_limited_npot 扩展可以放大这些尺寸 2D纹理的限制。如果支持, 地图和3D贴图的 限制仍然存在。
有出自本 扩展不同之处在于 实施进口的 扩展串将允许 应用到2D纹理 尺寸通过没有引入附加的程序或 enumerant API,其可以是或可以不是一个 功率两个。
在没有OES_texture_npot, 的其中升降机这些限制, 比CLAMP_TO_EDGE其它既不纹理映射也不涡卷模式与NPOT 2D纹理结合支持 。 使用包装模式的NPOT 2D纹理 不是CLAMP_TO_EDGE或 minfilter不是NEAREST或 LINEAR被认为是不完整的。如果 这样的纹理绑定到纹理单元,就好像该纹理单元的纹理映射 被禁用。
您可以使用下面的代码,以确定是否支持你的设备(菲利普赖德奥特的优秀iPhone 3D Programming书绘制)在这个扩展:
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);
不幸的是,this example application我有这使得以非幂的两个纹理使用OpenGL ES 2.0,所以我不确定在这种情况下会有什么帮助。
不幸的是,它不起作用。 glCheckFramebufferStatusOES返回GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS。 – GhassanPL 2011-01-21 16:04:37
@Kronikarz:你还创建了一个渲染缓冲区吗?如`glRenderbufferStorageOES(GL_RENDERBUFFER_OES,GL_RGBA8_OES,width,height);`连接到帧缓冲区? – 2011-01-21 16:26:30