Android NDK OpenGL ES 1.0 Простой рендеринг
Я начинаю с 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 () и т. д.
3 ответа
Я наконец-то нашел проблему после МНОГО ковыряния.
Оказывается, поскольку я вызывал код из GLSurfaceView.Renderer в Java, буфер кадра уже существовал и поэтому вызывал:
glGenFramebuffersOES(1, &framebuffer);
Я непреднамеренно выделял НОВЫЙ буфер, который не был прикреплен к целевому дисплею. Удалив эту строку и заменив ее на:
framebuffer = (GLuint) 0;
Теперь он рендерится в правильный буфер и правильно отображается на экране. Обратите внимание, что хотя я и не использую буфер в этом фрагменте, его изменение - вот что испортило правильное отображение.
Я не думаю, что это реальное решение вообще.
У меня возникла та же проблема: я использую объекты кадрового буфера внутри собственного кода и делаю
framebuffer = (GLuint) 0;
вы используете только фрейм-буфер по умолчанию, который всегда существует и зарезервирован для 0. Технически, вы можете стереть весь свой код, связанный с фрейм-буферами, и ваше приложение должно работать должным образом, так как фрейм-буфер 0 всегда генерируется и привязывается по умолчанию.,
Но вы должны иметь возможность генерировать несколько кадровых буферов и переключаться между ними, используя функцию привязки (glBindFramebuffer) по своему усмотрению. Но это, похоже, не работает с моей стороны, и я пока не нашел реального решения. На андроиде не так много документации, и я начинаю задумываться, действительно ли fbo поддерживается в нативном коде. Они действительно работают должным образом внутри кода Java, хотя, я проверил это с успехом!
Ой! И я только что заметил, что размер вашего буфера не равен степени 2... что обычно должно быть так для всех текстур / буферов, таких как структура в Opengl.
ОБНОВИТЬ:
Теперь я совершенно уверен, что вы не можете использовать FBO с Android (2.2 или ниже) и ndk (версия r5b или ниже). Это совершенно другая игра, если вы используете новую версию 3.1, где вы можете кодировать все свое приложение с помощью собственного кода (больше не требуется jni-оболочка), но я еще не тестировал его!
С другой стороны, мне удалось заставить буферы и текстуры трафарета работать безупречно! Поэтому обходной путь будет заключаться в том, чтобы использовать их для моей логики рендеринга и просто забыть о рендеринге FBO за кадром.
У меня были похожие проблемы при переходе с iOS на Android NDK, вот и мое полное решение.
OpenGLES 1.1 с FrameBuffer / ColorBuffer / DepthBuffer для Android с NDK r7b