gpt4 book ai didi

iphone - 对于某些纹理尺寸,glFramebufferTexture2D 在 iPhone 上失败

转载 作者:行者123 更新时间:2023-12-03 21:19:49 25 4
gpt4 key购买 nike

当我尝试将纹理附加到帧缓冲区时,glCheckFramebufferStatus 报告某些纹理大小的 GL_FRAMEBUFFER_UNSUPPORTED。我已经在第二代和第四代 iPod Touch 上进行了测试。两个模型之间失败的纹理大小并不相同。

以下是一些有趣的结果:

第二代 - 8x8 失败,16x8 失败,但 8x16 成功!

第四代 - 8x8 成功,8x16 成功,但 16x8 失败!

这是我用来测试附加不同大小的纹理的一些代码:

void TestFBOTextureSize(int width, int height)
{
GLuint framebuffer, texture;

// Create framebuffer
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

// Create texture
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D,0);

// Attach texture to framebuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture, 0);
GLenum error = glGetError();
GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
if (status==GL_FRAMEBUFFER_COMPLETE_OES)
NSLog(@"%dx%d Succeeded!",width,height,status);
else
NSLog(@"%dx%d Failed: %x %x %d %d",width,height,status,error,texture,framebuffer);

// Cleanup
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, 0, 0);
glDeleteTextures(1, &texture);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
glDeleteFramebuffersOES(1, &framebuffer);
}

void TestFBOTextureSizes()
{
int width,height;
for (width=1; width<=1024; width<<=1)
{
for (height=1; height<=1024; height<<=1)
TestFBOTextureSize(width,height);
}
}

看来只要两个尺寸都至少为 16 像素,那么在两个设备上一切都可以正常工作。但令我困扰的是,我还没有看到任何关于附加到帧缓冲区对象的纹理大小要求的文章。目前,一种解决方案是将我的纹理大小限制为至少 16 像素,但这可能会在将来出现问题,或者已经在我尚未尝试过的某些设备上出现问题?我还可以在启动时执行此测试代码,以便动态找出允许的纹理大小,但这似乎有点做作。

最佳答案

当我尝试在 iPod touch 4 上渲染到尺寸为 480x320(全屏,无分辨率比例)的纹理时,我遇到了类似的问题。当我调用 glCheckFramebufferStatus() 时,它会返回GL_FRAMEBUFFER_UNSUPPORTED。我的代码:

glGenTextures(1, &texture);    
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 480, 320, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0);
glBindTexture(GL_TEXTURE_2D, 0);

glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
// report error
}

调查这个问题我发现如果我们希望在渲染到纹理机制中使用GL_TEXTURE_2D,它必须是一个有效的OpenGL ES对象。这意味着纹理应该准备好绑定(bind)和使用。因此,要修复错误,我必须设置一些纹理参数。因为我使用非 POT 纹理,所以必须将 GL_TEXTURE_WRAP_ 设置为 GL_CLAMP_TO_EDGE(默认值为 GL_REPEAT)和 GL_TEXTURE_MIN_FILTERGL_NEARESTGL_LINEAR(默认值为GL_NEAREST_MIPMAP_LINEAR)来使用此纹理。

我找不到 16x8 的问题,但如果设置了此参数,16x9 和 17x8 就可以正常工作。我希望这些信息对您有所帮助。

关于iphone - 对于某些纹理尺寸,glFramebufferTexture2D 在 iPhone 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5835656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com