我正在看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等呈现到屏幕上?如果是这样,如何渲染到缓冲区然后渲染到屏幕?