如何在不显示EGL的情况下呈现EGLImageKHR

时间:2019-09-16 20:07:42

标签: c++ opengl

我正在看NVIDIA的以下代码,该代码从名为render_fd的文件描述符中渲染图像。

EGLImageKHR hEglImage;
bool frame_is_late = false;

EGLSyncKHR egl_sync;
int iErr;
hEglImage = NvEGLImageFromFd(egl_display, render_fd);
if (!hEglImage)
{
    COMP_ERROR_MSG("Could not get EglImage from fd. Not rendering");
    return -1;
}

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id);
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, hEglImage);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

iErr = glGetError();
if (iErr != GL_NO_ERROR)
{
    COMP_ERROR_MSG("glDrawArrays arrays failed:" << iErr);
    return -1;
}
egl_sync = eglCreateSyncKHR(egl_display, EGL_SYNC_FENCE_KHR, NULL);
if (egl_sync == EGL_NO_SYNC_KHR)
{
    COMP_ERROR_MSG("eglCreateSyncKHR() failed");
    return -1;
}
eglSwapBuffers(egl_display, egl_surface);
if (eglGetError() != EGL_SUCCESS)
{
    COMP_ERROR_MSG("Got Error in eglSwapBuffers " << eglGetError());
    return -1;
}
if (eglClientWaitSyncKHR (egl_display, egl_sync,
            EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR) == EGL_FALSE)
{
    COMP_ERROR_MSG("eglClientWaitSyncKHR failed!");
}

if (eglDestroySyncKHR(egl_display, egl_sync) != EGL_TRUE)
{
    COMP_ERROR_MSG("eglDestroySyncKHR failed!");
}
NvDestroyEGLImage(egl_display, hEglImage);

这是片段着色器:

#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 interp_tc; 
uniform samplerExternalOES tex;
void main() {
    gl_FragColor = texture2D(tex, interp_tc);
};

问题是我想独​​立于显示器进行渲染(或者我应该对EGL显示器进行sar?)。我可能现在想显示它,但是将来我根本不想使用任何显示器。我想渲染到某个东西,然后将此东西插入另一个渲染它的opengl程序。

我找到了documentation of NvEGLImageFromFd

EGLImageKHR NvEGLImageFromFd(EGLDisplay display, int dmabuf_fd)         

从dmabuf-fd创建一个EGLImage实例。

参数     [in]显示EGLImage创建期间使用的EGLDisplay对象。如果为NULL,则nvbuf_utils API使用其自己的EGLDisplay实例。     [in] dmabuf_fd将从其创建EGLImage的缓冲区的DMABUF FD。

看起来我可以将NULL传递给它,所以我尝试了以下代码:

    EGLImageKHR hEglImage;

    int iErr;
    hEglImage = NvEGLImageFromFd(NULL, decodedNvFrame->nvBuffer->planes[0].fd);
    if (!hEglImage)
        printf("Could not get EglImage from fd. Not rendering\n");

    glBindVertexArray(vertexArrayObject);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id);
    glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, hEglImage);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    iErr = glGetError();
    if (iErr != GL_NO_ERROR)
        printf("glDrawArrays arrays failed:%i\n", iErr);

    NvDestroyEGLImage(NULL, hEglImage);

即使我看到没有错误,我也看到了屏幕上没有输出。有什么我想念的吗?是否需要将那些eglConfig,eglSurfaces等呈现到屏幕上?如果是这样,如何渲染到缓冲区然后渲染到屏幕?

0 个答案:

没有答案