我正在将用C ++(带有SDL)编写的游戏移植到Android。 我以前在机翼和祈祷上使用了一个较旧的项目(以前有过stackoverflow的帮助!)完成了此工作,但是尽管结果有些草率,但它几乎可以在我扔过的所有Android设备上使用。
那时,我太累了,无法重构和简化我拥有的东西。 这次,我正在创建一个引擎, 从理论上讲,我将不再需要动手,而是将旧代码传递给大家。 尽管我已编译并运行了所有程序,但它没有渲染任何内容。
具体来说,OpenGL ES 2.0抛出GL_FRAMEBUFFER_UNSUPPORTED消息。 我将所有内容绘制为一个纹理(它的大小为 320x240-最终会改变),然后绘制该纹理,使其覆盖屏幕。 它拒绝绘制该纹理-我可以直接在屏幕上绘制(至少使我希望着色器很好),但这并不是很有用。
我的帧缓冲代码看起来像这样:
_superDuperFrameBuffer = 0;
_depthRenderBuffer = 0;
glGenFramebuffers(1, &_superDuperFrameBuffer);
//-----
glGenTextures(1, &_screenTexture);
glBindTexture(GL_TEXTURE_2D, _screenTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SCREENWIDTH2, SCREENHEIGHT2, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); //float?
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if(_currentWidth < SCREENWIDTH2*2 || _currentHeight < SCREENHEIGHT2*2) {
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
else {
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
//-----
glGenRenderbuffers(1, &_depthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, SCREENWIDTH2, SCREENHEIGHT2);
glGenRenderbuffers(1, &_stencilRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _stencilRenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, SCREENWIDTH2, SCREENHEIGHT2);
glBindFramebuffer(GL_FRAMEBUFFER, _superDuperFrameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _screenTexture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _stencilRenderBuffer);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE) {
__android_log_print(ANDROID_LOG_VERBOSE, "LOG", "FRAMEBUFFER BORK %x", status);
}
我在这里做错什么明显吗? 这是一个简单的2D游戏-没什么花哨的,以前似乎都可以使用。 我不知道Android的最佳设置是什么-真的没有什么可以解释如何正确执行操作的。
从我正在阅读的内容来看,当其中一个设置与另一个设置不一致时,或者设备不支持帧缓冲区时,GL_FRAMEBUFFER_UNSUPPORTED应该会打开(我知道可以,因为我的上一款游戏运行良好!)
另外,有关代码可能无法正确清理-以前的版本或曾经出现过两次的版本有生命迹象,但在重新启动游戏后却没有。 我没有排除存在外界因素干扰的想法,但是我认为我首先要检查上面的代码是否正确。
在2013 Nexus 7上进行测试。
提前致谢!