2011-01-21 21 views
12

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

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

回答

2

它可以做到,你所需要做的就是获得比非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扩展。 textureWidthtextureHeight是2的大幂,而renderWidthrenderHeight是rendere的宽度和高度。 然后当你绑定到aFramebuffer它会画到纹理。

+0

不幸的是,它不起作用。 glCheckFramebufferStatusOES返回GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS。 – GhassanPL 2011-01-21 16:04:37

+0

@Kronikarz:你还创建了一个渲染缓冲区吗?如`glRenderbufferStorageOES(GL_RENDERBUFFER_OES,GL_RGBA8_OES,width,height);`连接到帧缓冲区? – 2011-01-21 16:26:30

26

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