将GL_TEXTURE_EXTERNAL_OES渲染到帧缓冲区

时间:2019-09-18 10:09:45

标签: c++ c opengl-es

这是我的代码的草图,我打算将其用于将图像从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);

0 个答案:

没有答案