Я хочу отображать изображение yuv на устройстве iOS. Я предполагаю, что это может быть достигнуто с помощью openGL. (На самом деле, мне нужно сделать несколько таких изображений подряд)Рисование изображения YUV с использованием GLKit openGL - iOS
Я понимаю, что GLKit - это абстракция, созданная iOS, в которой есть GLKView
, который будет иметь и обрабатывать буфер визуализации. В настоящее время я пытаюсь использовать GLKViewController
, и обновление фрейма выполняется с желаемыми fps. Это я согласен с использованием вызова функции glClear
.
Теперь задача заключается в рендеринг изображения на вид.
Существует класс GLKBaseEffect
, который будет иметь основные шейдеры. Я не могу понять, какие свойства установить, поэтому я просто создаю его и вызываю prepareToDraw
перед каждым рендерингом.
Существует класс для обработки текстур, GLKTextureLoader
, но мне кажется, что он работает только с изображениями кварца, т. Е. Плоскость yuv420 не может быть загружена в текстуру с использованием этого класса.
// create the texture
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, [imageNSData bytes]);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
Я использую этот код для создания текстуры и привязки его, но я действительно не знаю, что я здесь делаю. И что бы это ни было, на экране не появляется изображение, и я не знаю, что делать дальше.
Я не создал никаких шейдеров, предполагая, что у baseEffect будет что-то.
И это https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW8 говорит мне, что мне придется использовать EAGLayer для визуализации изображений на экране.
Могу ли я использовать GLKit для рендеринга изображений? Если ДА, у нас есть какой-либо пример кода или учебник, который не использовал бы класс GLKTextureLoader
(я не мог найти его)? Если нет, есть ли аналогичный учебник для рендеринга с использованием EAGLLayer
(об этом я до сих пор не изучал)?
Спасибо за ответ, это отличная помощь. О части yuv, действительно ли нам нужно преобразовать ее в данные rgb, прежде чем отправлять ее для рендеринга? Не существует ли метода, с помощью которого мы можем просто передать буфер yuv в openGL framework, и он обрабатывает само преобразование? И что я получаю, мне нужно создать прямоугольник с использованием вершинного шейдера сначала, а затем изображение будет отображено в этой области, правильно ли? – neeraj
Все пиксельные данные должны быть RGB в конечном итоге - экран является устройством RGB! Насколько мне известно, нет способа получить преобразование YUV в RGB, выполненное для вас в текстуре OpenGL, но ваш шейдер фрагментов может сделать преобразование в последний возможный момент, как показано в ['GLCameraRipple'] (https://developer.apple.com/library/ios/samplecode/GLCameraRipple/Introduction/Intro.html) пример кода. – rickster
да. Это то, что я только что скачал. Думаю, теперь я пойму этот подход, спасибо за помощь. – neeraj