繁体   English   中英

Android NDK OpenGL ES 1.0简单渲染

[英]Android NDK OpenGL ES 1.0 Simple Rendering

我从Android NDK和OpenGL开始。 我知道我在这里做错了(可能是几件事),并且由于我在测试时一直显示黑屏,所以我知道渲染没有发送到屏幕。

在Java中,我有一个GLSurfaceView.Renderer来调用这两个本地方法。 它们被正确调用,但没有绘制到设备屏幕上。

有人可以为此指出正确的方向吗?

以下是本机方法的实现:

int init()
{
    sendMessage("init()");

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

    glGenRenderbuffersOES(1, &colorRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, 854, 480);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

    GLuint depthRenderbuffer;
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, 854, 480);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

    GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
    if(status != GL_FRAMEBUFFER_COMPLETE_OES)
        sendMessage("Failed to make complete framebuffer object");

    return 0;
}

void draw()
{
    sendMessage("draw()");

    GLfloat vertices[] = {1,0,0, 0,1,0, -1,0,0};
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
}

日志输出为:

init()draw()draw()draw()等。

我认为这根本不是一个真正的解决方案。

我在本机代码中使用framebuffer对象并执行此操作时遇到了同样的问题

framebuffer = (GLuint) 0;

您只使用默认的帧缓冲区,该缓冲区始终存在并且保留为0。从技术上讲,您可以擦除与帧缓冲区相关的所有代码,并且您的应用程序应该正常运行,因为始终会生成帧缓冲区0,并且它是由defaut绑定的。

但是,您应该能够生成多个帧缓冲区,并根据需要使用绑定函数(glBindFramebuffer)在它们之间进行交换。 但这似乎并没有达到我的目的,而且我还没有找到真正的解决方案。 android部分没有太多文档,我开始怀疑本地代码是否真正支持fbo。 它们确实可以在Java代码中正常工作,但我已经成功地对其进行了测试!

哦! 我只是注意到您的缓冲区尺寸不是2的幂...通常对于所有纹理/缓冲区(例如Opengl中的结构)都是如此。


更新:

现在,我相当确定您不能在android(2.2或更低版本)和ndk(r5b或更低版本)上使用FBO。 如果您使用新的3.1发行版,则是完全不同的游戏,您可以在其中使用本机代码对所有应用程序进行编码(无需使用jni包装器),但是我尚未对其进行测试!

另一方面,我设法使模板缓冲区和纹理完美地工作! 因此,解决方法是将那些用于我的渲染逻辑,而无需考虑FBO屏幕外渲染。

经过大量修补后,我终于找到了问题。

事实证明,因为我是从Java中的GLSurfaceView.Renderer调用代码的,所以帧缓冲区已经存在,因此可以通过调用:

glGenFramebuffersOES(1, &framebuffer);

我无意中分配了未附加到目标显示器的NEW缓冲区。 通过删除此行并将其替换为:

framebuffer = (GLuint) 0;

现在,它可以渲染到正确的缓冲区并在屏幕上正确显示。 请注意,即使我没有在此代码段中真正使用缓冲区,但更改缓冲区还是弄乱了正确的显示。

从iOS迁移到Android NDK时,我遇到了类似的问题,这也是我的完整解决方案。

具有NDK r7b的带有FrameBuffer / ColorBuffer / DepthBuffer的OpenGLES 1.1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM