This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRA74P:无法从 QT 上的彩色渲染缓冲区创建有效的 EGLImageKHR 对象

Guru**** 633810 points
Other Parts Discussed in Thread: DRA74P
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/974989/dra74p-can-not-create-a-valid-eglimagekhr-object-from-a-color-render-buffer-on-qt

器件型号:DRA74P

您好,

我正在尝试保存 DRA74P 平台(在陆地上运行 QT)上的 QML 快速控制应用的屏幕截图 通过使用本机 OpenGL 函数。我要做的是将 RGB 颜色呈现缓冲区与 eglCreateImageKHR 函数一起使用、然后通过 Qt 套接字通信将 EGLImageKHR void 指针发送到另一个器件。 我可以成功创建 EGLImage,这意味着 eglGetError 函数没有错误。 为了测试 EGLImageKHR 对象的正确性,我在同一进程中使用 glEglImageTargetRenderbufferStorageOES 将其绑定到另一个帧缓冲区,并从 glReadPixel 函数中读取像素,从读取缓冲区创建 png 文件,并观察到使用正确的颜色创建了正确的 png。

之后、我尝试将此 EGLImageKHR void 指针发送到另一个器件或进程、然后从感应的 EGLImageKHR 对象创建一些 png、但我看不到正确的彩色 png、仅在 png 上有噪声。

以下是从渲染缓冲区创建 EGLImageKHR、然后从 EGLImageKHR 保存 tga_file 的代码示例。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//创建呈现缓冲区并将其绑定到帧缓冲区
glGenRenderBuffer(1,&rendBuffer);
glBindRenderbuffer( GL_RENDERBUFFER, RendBuffer );
glRenderBufferStorage (GL_RENDERBUFFER、GL_RGB、mWinWidth、mWinHeight);
glBindRenderbuffer(GL_RENDERBUFFER, 0);//mwindow->openglContext()->defaultFramebufferObject();

if (glGetError()=GL_NO_ERROR)

//qDebug()<<"Render buff storage is OK"<<glGetError();

其他

qDebug()<<"Render buff storage error is "<<glGetError();

glGenFrameBuffer( 1,&framebuffer);
glBindFramebuffer (gL_framebuffer、framebuffer);
glFramebufferRenderbuffer (GL_framebuffer、GL_color_ATTACHMENT0、GL_RENDERBUFFER、RendBuffer);

//printFramebufferInfo (framebuffer);
if (glCheckFramebufferStatus (gL_framebuffer)!= gL_framebuffer_complete)

qDebug()<<"Fraamebuffer error is "<<glGetError();

其他

//qDebug()<<"Fraamebuffer is OK"<<glGetError();

//创建 EGLImageKHR 对象
mWinWidth = mwindow->width();
mWinHeight = mwindow->height();

glGetIntegerv (GL_PACK_alignment、&rowPack);
glPixelStorei (GL_Pack_alignment、1);glBindFramebuffer (GL_Read_Framebuffer、mwindow->openglContext()->defaultFrameBufferObject ());
glBindFramebuffer (gL_Draw 帧缓冲区、帧缓冲区);
glBlitFrameBuffer (0、0、mWinWidth、mWinHeight、0、 0、mWinWidth、mWinHeight、GL_color_buffer_bit、GL_Nearest);

m_display = reinterpret_cast (reinterpret_cast (QGuiApplication::platformNativeInterface()->nativeResourceForIntegration ("egldisplay")));
m_context = QGuiApplication::platformNativeInterface()-> nativeResourceForContext ("eglcontext"、mwindow->openglContext ());

mImage = CreateImageKHR (m_display、m_Context、EGL_GL_RENDERBUFFER_KHR、reinterpret_cast (renderBuffer)、nullptr);

if (mImage == EGL_NO_IMAGE_KHR)

qDebug ("无法从目标缓冲区生成图像:%s"、get_EGL_error());
返回-1;

int size = mWinWidth * mWinHeight * 3;
sendEglImage (size);
glDeleteRenderBuffers (1、渲染缓冲区);
渲染缓冲区= 0;
glDeleteFrameBuffers (1、framebuffer);
帧缓冲区= 0;

//将 EGLImageKHR 发送到客户端
sendEglImage (int size)

if (SenderBase!=空)

QByteArray 数据;
data.append (reinterpret_cast (mImage)、大小);
//data.append (reinterpret_cast (mImage));
QDataStream Out (&data、QIODevice::WriteOnly);
out.setDevice(SenderSocket);
out << data;
//qDebug ()<<"func "<<__function__<<"line"<<__line__;
qDebug ()<<"func "<<__function__<<"line"<<__line__<<"data size"<< data.size ();

QImage testImg (((uchar *) mImage、640、480、QImage::Format_RGB888、nulptr、nullptr);
if (testimg.save("server.png"))
qDebug()<<"Successfully saved image"<<testImg;

DestroyImageKHR (m_display、mImage);
mImage = 0;

//从 EGLImageKHR 创建 tga_file 的另一种方法是
文件*out = fopen ("tga_file"、"w");
短 TGAHEAD []={0、2、0、0、0、 0、640、480、24};
ftwrite (&TGAhead、sizeof (TGAhead)、1、out);
fwrite (mImage、mWinWidth * mWinHeight* 3、1、out);
FFLUSH (OUT);
fclose(out);

//另一个不同的试验

int bufSize = mWinHeight * mWinWidth*3; 
unsigned char * trialBuff = new unsigned char[bufSize]; 
memcpy (trialBuff、khrImage、bufSize); 

文件*out = fopen ("dada.txt"、"w"); 
fwrite (trialBuff、bufSize、1、out); 
FFLUSH (OUT); 
fsync (fileno (out)); 
fclose(out); 
删除[] trialBuff; 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
因此、当我尝试使用 QImage 或通过 EGLImageKHR 对象 fwrite 创建 png 时、我不会获得有效的 png 或 tga_file。

请帮我调试 EGLImageKHR 创建,如何从 EGLImageKHR 创建一些 png 文件
以及如何将其发送到另一台设备?

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    对延迟答复表示歉意。 您是否仍然面临这方面的问题?

    您能否共享一些日志来指示正在发生什么情况? 在本例中、glReadPixels 是否适合您读回渲染的数据? 这还将显式同步渲染、并确保在您尝试使用输出之前完成渲染-以防出现问题(尚不确定)。

    此致

    Hemant