в Android NDK возможно ли заставить OpenGL ES 1.1 работать с типичным шаблоном GLSurfaceView на стороне java (переопределение методов из GLSurfaceView.Renderer onDrawFrame, onSurfaceCreated и т. д.) при использовании на стороне C ++ буферов кадров, цвета и глубины, и ВБО?
Я пытаюсь создать их, используя это:
void ES1Renderer::on_surface_created() {
// Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
glGenFramebuffersOES(1, &defaultFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
// Create color renderbuffer object.
glGenRenderbuffersOES(1, &colorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);
// create depth renderbuffer object.
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}
Тем не менее, кажется, что это не дает должным образом контекст, который, я думаю, создается, когда инициализируются GLSurfaceView и рендерер (сторона Java).
Я не эксперт ни по NDK, ни по OpenGLES, но мне нужно портировать приложение для iOS, использующее OpenGL ES 1.1, и я стремлюсь использовать как можно больше кода. Поскольку приложение также использует компоненты пользовательского интерфейса платформы (кнопки, списки и т. Д.), При рисовании графики GL, я подумал, что это будет наилучшим способом. Тем не менее, я сейчас рассматриваю возможность использования нативного действия, хотя я не уверен, каковы будут отношения с другими компонентами Java.
Абсолютно да. Стандартный подход заключается в том, что вы создаете GLSurfaceView
Как и при использовании OpenGL из Java, создайте и подключите GLSurfaceView.Renderer
реализации, и пусть поток рендеринга запускается.
От твоего Renderer
методы, как onSurfaceCreated()
а также onDrawFrame()
Теперь вы можете вызывать функции JNI, которые вызывают функции в вашем собственном коде. В этих нативных функциях вы можете делать любые вызовы API OpenGL, какие пожелаете. Например, в функции, которую вы вызываете из onSurfaceCreated()
Вы можете создать несколько объектов и установить начальное состояние. В функции, которую вы вызываете из onSurfaceChanged()
Вы можете настроить окно просмотра и проекцию. В функции, которую вы вызываете из onDrawFrame()
Вы делаете свой рендеринг.
Вы даже можете делать вызовы OpenGL как из Java, так и из собственного кода. Java OpenGL API — это очень тонкий слой вокруг нативных функций. Не имеет значения, если функции вызываются из собственного кода или через Java API.
Единственное, что вам нужно остерегаться, это то, что вы вызываете все ваш родной код, который делает вызовы OpenGL API из GLSurfaceView.Renderer
реализации onSurfaceCreated()
, onSurfaceChanged()
а также onDrawFrame()
, Когда эти методы вызываются, вы находитесь в потоке рендеринга и имеете текущий контекст OpenGL. Если собственный код OpenGL вызывается из любого другого места, есть вероятность, что вы находитесь в неправильном потоке и / или у вас нет текущего контекста OpenGL.
Конечно, существуют более сложные установки, в которых вы создаете свои собственные контексты OpenGL, явно делаете их текущими и т. Д. Но я настоятельно рекомендую придерживаться простого подхода, описанного выше, если у вас нет веских причин для чего-то большего. Для большинства стандартного рендеринга OpenGL того, что я описал, должно быть вполне достаточно.