在iPhone上渲染为非幂次双纹理

在iPhone上渲染为非幂次双纹理,iphone,opengl-es,render-to-texture,Iphone,Opengl Es,Render To Texture,是否可以在iPhone(2G及以上版本)上使用OpenGL ES 1.1渲染到纹理?如果将纹理绑定为渲染缓冲区,它必须是渲染缓冲区的大小,而不是罐大小。但是OpenGLES1.1要求纹理是POT 也许在ES 1.1上做不到?可以做到,你所需要做的就是获得比非POT更大的下一个2次方 然后生成帧缓冲区: GLuint aFramebuffer; glGenFramebuffersOES(1, &aFramebuffer); 和纹理: GLuint aTexturebuffer; glGe

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


也许在ES 1.1上做不到?

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

虽然OpenGL ES 1.1不支持两种纹理的非增强功能,但较新的iOS设备型号具有扩展,该扩展说明:

传统的OpenGL ES 1.X纹理 仅限于具有二次幂的图像 (罐)尺寸。 苹果纹理2D有限公司 扩展可以放松这些尺寸 2D纹理的限制。这个 多维数据集的限制仍然存在 贴图和三维纹理(如果支持)

没有额外的程序或程序 此应用程序引入的枚举器API 除了 导出 扩展字符串将允许 在二维纹理中传递的应用 可能是也可能不是一个 二的力量

在没有纹理的情况下, 解除了这些限制,, 既不是mipmapping模式,也不是wrap模式 除夹具外,还支持夹具至夹具边缘 与NPOT 2D纹理结合使用。 具有包裹模式的NPOT 2D纹理 这不是夹紧到边缘或 minfilter不是最近的,或者 线性被认为是不完整的。如果 这样的纹理被绑定到纹理 单位,就好像纹理贴图一样 已为该纹理单元禁用

您可以使用以下代码确定您的设备是否支持此扩展(摘自Philip Rideout的优秀著作):

在这些设备上,只要设置正确的纹理环绕,就应该能够使用两种纹理的非幂:

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的非二次方纹理渲染,所以我不确定在这种情况下它是否能帮助您。

不幸的是,它不起作用。GLCheckFrameBufferStatus返回GL_FRAMEBUFFER_Completed_维度。@Kronikarz:您也创建了渲染缓冲区吗?如
glRenderbufferStorageOES(GL_RENDERBUFFER_OES,GL_RGBA8_OES,宽度,高度)
要连接到帧缓冲区?@Kronikarz:根据我的经验,您也应该能够渲染到非POT纹理,而不必对大小进行取整。@Kronikarz:要清楚,iPhone在非常特定的条件下绝对支持GL 1.1下的非POT纹理。(我一直在使用它们。)技术说明在这里:我找不到iOS文档,因为它引用了它。你的tex参数必须符合某些限制。@Kronikarz:啊,你又回到了2G或其他什么位置了。你应该在问题中澄清这一点,让人们知道你在问遗留(坦率地说)平台的问题。祝你好运不应使用strstr检查扩展字符串中的扩展名。这并不能确保以相同前缀开头的另一个扩展不会被误解。说如果你有GL_ARB_shadow_ambient,用strstr检查GL_ARB_shadow会咬你。很久以前,当一个软件更新在驱动程序中引入了一个新的GL扩展,并在发布数月后破坏了我的代码时,我曾经被咬过一次。@rotoglup-这是一个很好的观点。正如我所说,这是从菲利普·里多特的书中提取的代码。也许你可以给他写一些书上的勘误表。谢谢@rotoglup,我正在把这个添加到我的书的勘误表中。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);