Чтобы дать представление о проблеме, я хочу реализовать некоторую обработку изображений при рендеринге 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, я провел несколько экспериментов без успеха.
Как мне улучшить производительность