这是我的代码的草图,我打算将其用于将图像从GL_TEXTURE_EXTERNAL_OES
渲染到帧缓冲区。为什么不直接渲染?因为它涉及使用EGL显示器,所以我无法使其正常工作,但是我还需要渲染到帧缓冲区,所以让我们尝试一下。
如您所见,我评论了与EGL相关的代码,因为我不知道是否有必要。我认为glDrawArrays
应该以某种方式有效地呈现我的纹理,但是我很困惑
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glGenTextures(1, &externalTexture);
glGenTextures(1, &frameBufferTexture);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, externalTexture);
glActiveTexture(GL_TEXTURE0+1);
glBindTexture(GL_TEXTURE_2D, frameBufferTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, decodedNvFrame->width, decodedNvFrame->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frameBufferTexture, 0);
EGLImageKHR hEglImage;
EGLSyncKHR eglSync;
int iErr;
hEglImage = NvEGLImageFromFd(eglDisplay, decodedNvFrame->nvBuffer->planes[0].fd);
if (!hEglImage)
printf("Could not get EglImage from fd. Not rendering\n");
glUniform1i(texLocation, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, externalTexture);
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, hEglImage);
glBindVertexArray(vertexArrayObject);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
iErr = glGetError();
if (iErr != GL_NO_ERROR)
printf("glDrawArrays arrays failed: %i\n", iErr);
/*
eglSync = eglCreateSyncKHR(eglDisplay, EGL_SYNC_FENCE_KHR, NULL);
if (eglSync == EGL_NO_SYNC_KHR)
printf("eglCreateSyncKHR() failed\n");
eglSwapBuffers(eglDisplay, eglSurface);
if (eglGetError() != EGL_SUCCESS)
printf("Got Error in eglSwapBuffers %i\n", eglGetError());
if (eglClientWaitSyncKHR (eglDisplay, eglSync,
EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR) == EGL_FALSE)
{
printf("eglClientWaitSyncKHR failed!\n");
}
*/
glActiveTexture(GL_TEXTURE0+1);
glBindTexture(GL_TEXTURE_2D, frameBufferTexture);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(0, 0, 512, 512, GL_RED, GL_UNSIGNED_BYTE, r);