OpenGL ES Запуск нескольких шейдеров - PullRequest
2 голосов
/ 29 марта 2011

Основываясь на предыдущем вопросе, я исследовал, как запускать несколько шейдеров за один проход (т.е. иметь один FBO и рендерить в текстуру).Это OpenGLES 2 на Iphone.

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

Входные данные - это основной видеобуфер с камеры.

Любые указатели или исправления приветствуются:).

Спасибо,

Симон

PS: я пока все в одном методе - просто чтобы я мог сосредоточиться на том, чтобы заставить его работать!

- (void) PingPong:(CVImageBufferRef)cameraframe;
{
int bufferHeight = CVPixelBufferGetHeight(cameraframe);

int bufferWidth = CVPixelBufferGetWidth(cameraframe);

// Build the first FBO - this is wasteful - don't do this everytime
GLuint firstFBO;
glGenFramebuffers(1, &firstFBO);
glBindFramebuffer(GL_FRAMEBUFFER, firstFBO);

// Build the first texture and copy the video stuff into it
GLuint sourcetexture;
glGenTextures(1, &sourcetexture);
glBindTexture(GL_TEXTURE_2D, sourcetexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);


// Build the second texture
GLuint nextTexture;
glGenTextures(1, &nextTexture);
glBindTexture(GL_TEXTURE_2D, nextTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

// Attach the texture to our first FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourcetexture, 0);


// Using BGRA extension to pull in video frame data directly
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraframe));

//glDrawBuffer(sourcetexture);
glEnable(GL_TEXTURE_2D);
glViewport(0, 0, backingWidth, backingHeight);
glBindTexture(GL_TEXTURE_2D, sourcetexture);
glUseProgram(greyscaleProgram);

// Now do the 2nd pass using the sourcetexture as input
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, nextTexture, 0);
glBindTexture(GL_TEXTURE_2D, nextTexture);
glUseProgram(program);

// Present the framebuffer to the render buffer
[EAGLContext setCurrentContext:context];

glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);

[context presentRenderbuffer:GL_RENDERBUFFER];

// Clean up stuff
glDeleteTextures(1, &sourcetexture);
glDeleteTextures(1, &nextTexture);

}

1 Ответ

3 голосов
/ 29 марта 2011

Где твой код розыгрыша? Рисование - это то, что запускает выполнение шейдера, и ваш код, как я вижу его сейчас, имеет нулевые вызовы рисования (glDrawArrays, glDrawElements и т. Д.), Поэтому он не работает, потому что вы не рисуете.

Нарисуйте полноэкранный квад для запуска шейдера для каждого прохода, и он будет работать.

Также рекомендуется использовать glCheckFramebufferStatus, чтобы проверить, поддерживается ли ваша конфигурация FBO и будет ли она работать в вашей реализации GL.

...