私は、OpenGLでビデオストリームを表示するプロジェクトに取り組んでいて、QOpenGLWidget
の内容を外部の画面に表示しています。だから、私がやったのは、OpenGLウィジェットにストリームを表示してから、glReadPixels
に2つのPixel Pack Buffer Objectを使ってバッファを取得し、それを別の画面に送ります。問題は、私がそうでないときと比較してPBOを使用するときのパフォーマンスが低下していることです。ここでQt/OpenGL:PBOを正しく使用していますか?
は、コードの興味深い部分である:外部画面に送信することになるだろうフレームを作成するための
コード:
screenBuffer
がQOpenGLWidget
からフレームを格納するためのメモリバッファでありますコードのこの時点で
、PBOは既にpaintGL
機能
初期化:ここ
void GLWidget::InitializeGL(){
pbo1 = new QOpenGLBuffer(QOpenGLBuffer::PixelPackBuffer);
pbo1->create();
pbo1->bind();
pbo1->allocate(vWidth*vHeight*3);
pbo1->release();
pbo2 = new QOpenGLBuffer(QOpenGLBuffer::PixelPackBuffer);
pbo2->create();
pbo2->bind();
pbo2->allocate(vWidth*vHeight*3);
pbo2->release();
}
IはglReadPixels
void GLWidget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT);
program->bind();
{
vao.bind();
glBindTexture(GL_TEXTURE_2D, tex);
glDrawArrays(GL_QUADS, 0, 4);
glBindTexture(GL_TEXTURE_2D, 0);
vao.release();
}
program->release();
if(!isZoomed){
programMouse->bind();
{
vaoMouse.bind();
glLineWidth(2.0);
glDrawArrays(GL_LINES, 0, 8);
vaoMouse.release();
}
programMouse->release();
}
if(pboIndex){
pbo2->bind();
}else{
pbo1->bind();
}
glReadPixels(0, 0, vWidth, vHeight, GL_RGB, GL_UNSIGNED_BYTE, 0);
if(pboIndex){
pbo2->release();
}else{
pbo1->release();
}
}
pboIndex
とPBOを使用することは、第一及び第二のPBOとの間に交互に値を切り替えるだけブール値です。
私はパフォーマンスが低下しているので、間違っていますか?私は間違った方法でPBOを使用しているか、または私がそれらを使うべき状況を正しく理解していない。
おかげ
もちろん、バッファの長さを単純に増やすと、余分な遅延が発生します。Direct3DのようないくつかのAPIは、レンダリングされたフレーム表示にFIFOキューを使用します。これは、キュー内のすべてのバッファに対して1フレームのレイテンシを追加します(各フレームは、次のフレームに移動する前に表示されなければなりません)。絶対にビデオアプリケーション、ドロップフレームのこのデザインを使用しないでください。 –