我正在将用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上进行测试。

提前致谢!

===============>>#1 票数:1

如评论中所述,帧缓冲区在不绑定深度和模板渲染缓冲区的情况下工作。 这是GL [ES]的常见问题,因为没有查询支持的组合和/或格式的方法。 您只需要尝试一下,看看它是否有效-否则,实际问题并不总是很清楚。 根据GLES 2.0规范

4.1按片段的操作除闭塞查询,逻辑运算,alpha测试和颜色索引相关的操作外,所有OpenGL 2.0的按片段操作均受支持。 支持深度和模板操作,但是不需要选择包含深度或模板缓冲区的配置,但需要注意的是,OpenGL ES 2.0实现必须支持至少一个深度位深度为16或更高以及模板位深度的配置8或更高。

但是,它不需要任何特定的深度和/或模板格式或其组合。 glCheckFramebufferStatus联机帮助页指出:

GL_DEPTH_COMPONENT16是唯一的深度可渲染格式。 GL_STENCIL_INDEX8是唯一的可模版渲染格式。

该语句可以(并且可以)通过扩展进行修改。 它也没有明确声明两者的组合必然形成有效的组合,这将导致glCheckFramebufferStatus报告成功,而在某些驱动程序中,它们却没有(Adreno 320可能是其中之一)。

事实是,许多(大多数)Android GPU支持GL_OES_packed_depth_stencil扩展,该扩展提供了DEPTH24_STENCIL8_OES格式,因此,如果该扩展可用,则DEPTH24_STENCIL8_OES应该优于GL_DEPTH_COMPONENT16GL_STENCIL_INDEX8组合,并与驱动程序一起受支持。 使用此格式创建的渲染缓冲区应同时绑定到GL_DEPTH_ATTACHMENTGL_STENCIL_ATTACHMENT 此扩展已成为GLES 3.0中的标准,这意味着每个支持GLES 3.0的设备都应具有此扩展。

当然,如果您不需要深度/模板附件,那么它们只是浪费内存,因此您不应该使用它们。 虽然,如果您只是移植任意渲染代码,则绑定它们可能更安全。

  ask by Bobby Finch translate from so

未解决问题?本站智能推荐:

1回复

Android OpenGL ES 2.0是否支持使用扩展的顶点数组对象?

我正在尝试使用Android NDK编写一些在C ++中使用VAO的代码。 我希望能够使用glDeleteVertexArraysOES , glGenVertexArraysOES和glBindVertexArrayOES 。 我包括OpenGL ES 2的标题和我标题中的扩展名。
2回复

OpenGL ES 3实例渲染失败,但在桌面上工作

我能够在具有GLSL 330核心的桌面上使用实例渲染,但我无法在Android上运行相同的C ++代码(使用SDL2和NDK构建系统和Android Studio)。 logcat错误如下所示: 我的桌面和移动着色器代码是相同的,除了文件顶部的#version行(分别指定es或桌面
1回复

在Android NDK上通过JNI从OpenGL ES Framebuffer创建位图图像

我正在尝试从OpenGL ES捕获帧缓冲区数据并从中创建图像,这基本上是一种捕获屏幕截图的方式 我正在尝试通过JNI使用BitmapFactory类进行转换。 这是我当前的代码: size_t size = w * h; uint8_t *pixels = new uint8_t[si
1回复

Android NDK中的OpenGL ES 2.0:没有被绘制

我有一个2D游戏项目,我正在移植到使用OpenGL ES 2.0的Android。 我无法在屏幕上绘制任何内容(除了清除屏幕的纯色)。 在我的Windows环境中运行时,一切都呈现得很好,但当然不同版本的OpenGL环境设置也不同。 我按照本机活动样本,从其他几个OpenGL ES 2
1回复

将OpenGL应用程序移植到NDK。 着色器效果看起来不同

我已经在OpenGL(非固定管道)中编写了一个应用程序。 我已使用NDK将应用程序移植到Android,并且存在一些问题。 一切都变暗了,有些对象没有按预期显示。 视窗 安卓系统 (来源: vvcap.net ) 右边的茶壶是黑色的,有一些奇怪的反射。
2回复

Android NDK打开GL ES 2没有Java的设置

我想制作一个完全从本机代码绘制开放gl图形的android应用程序,换句话说,我在c / c ++代码中使用native_app_glue 。 但是,我在Internet上找不到单个资源,它指向完全从本机代码使用open gl! 我找到的所有链接都显示了如何在Java中使用GLSurfa
1回复

在Android NDK上创建映射/直接OpenGL ES纹理

我正在开发一个需要访问OpenGL ES 2.0纹理像素的Android NDK应用程序。 OpenGL扩展允许执行此操作,如此处 , 此处和此处所述 。 所有这些方法都需要使用不是 NDK一部分的GraphicBuffer类(参见例如此处 )。 显然,这需要访问私有C ++ And
1回复

Android NDK,Opengl ES 2,VBO使渲染崩溃

好的,这是我第四次发布此问题。 我知道这是一个复杂的问题。 我将解释所有内容,因为我不知道什么重要或不重要,而且这个问题看起来是代码中的一些愚蠢的东西,我没有意识到。 几天前,我一直在使用c ++ NDK中的渲染部分开发适用于Android的游戏引擎,对此我没有任何问题,我可以在任
1回复

Android OpenGL ES 2.0 GLM投影不起作用

我正在使用c / c ++(NDK)for android在opengl es 2.0中编程。 由于没有适用于android的官方C ++库,因此我正在使用GLM库 ! 到目前为止,我可以在黑色背景上绘制一个白色三角形,而无需应用任何投影/视锥或相机/视图矩阵。 当然,这会导致三角形沿
1回复

Android NDK C ++ openGL ES 2上下文显示不正确

我正在尝试使用C ++中的NDK实现openGL ES 2.0游戏。 我的测试设备是ASUS Zenphone 5,我可以肯定它支持openGL ES 2.0,因为它可以非常流畅地运行来自Play商店的基于openGL ES 2的游戏,还可以运行androind NDK中的helloGl2示例