В конце концов, я я хочу создать шейдер, который может преобразовывать видео в черно-белое (а затем применять некоторые другие эффекты, о которых я не уверен, следует ли раскрывать), просто потому, что выполнение этого на процессоре дает мне около 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
Однако они оказались для меня довольно бесплодными. Любая помощь будет принята с благодарностью.