[英]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.