Отображение / обработка кадров камеры iPhone с помощью OpenGL ES 2.0

В конце концов, я я хочу создать шейдер, который может преобразовывать видео в черно-белое (а затем применять некоторые другие эффекты, о которых я не уверен, следует ли раскрывать), просто потому, что выполнение этого на процессоре дает мне около 1 кадра в секунду.

В любом случае, сейчас я просто хочу вывести видеокадры на экран. Я могу рисовать треугольники на экране, поэтому я знаю, что мое представление OpenGL работает правильно, и я m получение NSLogs из метода

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
       fromConnection:(AVCaptureConnection *)connection {

. Этим методом я пытаюсь нарисовать весь рисунок. К сожалению, я делаю что-то не так ... и кадр камеры не отрисовывается.

Вот мой простой вершинный шейдер:

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

void main()
{
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
}

(Я знаю, что он компилируется и снова работает, из-за примитивов, которые я могу рендерить.)

Вот мой упрощенный шейдер фрагментов:

varying highp vec2 textureCoordinate;

uniform sampler2D videoFrame;

void main()
{
    gl_FragColor = texture2D(videoFrame, textureCoordinate);

}

И ... вот где я пытаюсь собрать все вместе, ха-ха:

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
       fromConnection:(AVCaptureConnection *)connection {   

    //NSLog(@"Frame...");
    CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer);  
    CVPixelBufferLockBaseAddress(cameraFrame, 0);
    int bufferHeight = CVPixelBufferGetHeight(cameraFrame);
    int bufferWidth = CVPixelBufferGetWidth(cameraFrame);

    //these er, have to be set
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // This is necessary for non-power-of-two textures
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    //set the image for the currently bound texture 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraFrame));

    static const GLfloat squareVertices[] = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        -1.0f,  1.0f,
        1.0f,  1.0f,
    };

    static const GLfloat textureVertices[] = {
        1.0f, 1.0f,
        1.0f, 0.0f,
        0.0f,  1.0f,
        0.0f,  0.0f,
    };

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, videoFrameTexture);

    // Update uniform values
    glUniform1i(videoFrameUniform, 0);

    glVertexAttribPointer(0, 2, GL_FLOAT, 0, 0, squareVertices);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 2, GL_FLOAT, 0, 0, textureVertices);
    glEnableVertexAttribArray(1);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
}

Не работать правильно.

Любая помощь будет чрезвычайно признательна, у меня нет идей и я здесь в растерянности. Заранее спасибо!

** Изменить: вот мой код, который я использую для настройки представления, загрузки OpenGL и запуска сеанса захвата. (1, "Джимми") (2, 'Альберт') (3, Мишель) (4, 'Felix') если вы это сделаете: (выберите * из EMPLOYEE) вы получите: (1, 'Jimmy') (2, 'Альберт') ни один из символов не может быть найден, поскольку он не связан с двоичным файлом libzmq.a.

Как мне скомпилировать libzmq.a для использования с iPhone. Кроме того, как мне получить ссылку на мой проект?

Я попробовал некоторые из предложений из этого поста: Скомпилировать C lib для iPhone

Однако они оказались для меня довольно бесплодными. Любая помощь будет принята с благодарностью.

6
задан Community 23 May 2017 в 12:20
поделиться