Qt OpenGL рендеринг в текстуру - PullRequest
0 голосов
/ 23 января 2020

Чтобы дать представление о проблеме, я хочу реализовать некоторую обработку изображений при рендеринге openGL. Поэтому я решил использовать концепцию Render to Texture. Эта реализация находится в Qt / OpenGL, и целью является Embedded platform. Размер окна составляет 1280 * 720.

Проблема, с которой я сталкиваюсь, заключается в том, что без Render to texture я могу достичь около 47 кадров в секунду, а с Render для текстурирования fps падает до 20.

Что я делаю прямо сейчас, что я создаю буфер кадров в Qt с помощью QOpenGLFramebufferObject, и это, как я инициализирую его в InitializeGL (). Я создаю размер кадрового буфера как размер окна, который составляет 1280 * 720.

QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
m_fbo = new QOpenGLFramebufferObject(SCR_WIDTH, SCR_HEIGHT, format);

В функции PaintGL () я сначала привязываю буфер кадров, выполняю весь рендеринг и генерирую текстуру из этого буфера кадров, к которому я применяю обработка изображений. В приведенном ниже коде функция OnTrip () представляет собой рендеринг OpenGL. Внутри drawOpticalDistortedTexture () я связываю буфер и рисую текстуру, используя функцию glDrawElements () в Qt.

void MainWidget::paintGL()
{

   if (!tripEnded)
   {
       m_fbo->bind();
       onTrip();
   }
   else
   {
       m_fbo->bind();
       onEndTrip(); 
   }
   QImage imagefbo = m_fbo->toImage();
   m_fbo->release();

   QOpenGLTexture* textureProcessed = initTexturesHelper(imagefbo);
   glViewport(SCR_WIDTH_OFFSET, SCR_HEIGHT_OFFSET, (GLsizei)SCR_WIDTH, (GLsizei)SCR_HEIGHT);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   /*************************** Post processed Drawing *********************************************/
   programOpticalDistortion.bind();
   modelMatrix.setToIdentity();
   programOpticalDistortion.setUniformValue("mvp_matrix", getOrthoProjectionMatrix() * modelMatrix);
   programOpticalDistortion.setUniformValue("tex", 0);
   programOpticalDistortion.setUniformValue("k1", distortionFactor);
   programOpticalDistortion.setUniformValue("screenDimen", screenDimension);
   textureProcessed->bind();
   // Draw Texture geometry
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   geometries->drawOpticalDistortedTexture(&programOpticalDistortion);
   glDisable(GL_BLEND);
   textureProcessed->release();
   programOpticalDistortion.release();
   /*************************** Post processed Drawing - End *********************************************/

   ++frameCount;
   if (frameTime.elapsed() >= 1000)
   {
       float fps = frameCount / ((double)frameTime.elapsed() / 1000.0f);
       qDebug() << "FPS" << "  " << fps ;
   }
}

VS-шейдер, как показано ниже,

#version 300 es
uniform mat4 mvp_matrix;
in vec4 a_position;
in vec2 a_texcoord;
out vec2 v_texcoord;
void main()
{
   // Calculate vertex position in screen space
   gl_Position = mvp_matrix * a_position;
   v_texcoord = a_texcoord;
}

Фрагментный шейдер как показано ниже,

#version 300 es
#undef lowp
#undef mediump
#undef highp

precision mediump float;

uniform sampler2D tex;
uniform float k1;
uniform vec2 screenDimen;

in vec2 v_texcoord;
out vec4 out_color;

 //! [0]
void main()
{
    vec2 uv = (gl_FragCoord.xy / screenDimen.xy) - vec2(0.5);
    float uva = atan(uv.x, uv.y);
    float uvd = sqrt(dot(uv, uv));
    uvd = uvd*(1.0 + k1*uvd*uvd);
    out_color = texture(tex, vec2(0.5) + vec2(sin(uva), cos(uva))*uvd);
}

У меня нет проблем с конечным выводом, но сейчас основной проблемой является fps, я провел несколько экспериментов без успеха.

Как мне улучшить производительность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...