全部問候,QGLWidget和硬件加速?
是否簡單地繼承QGLWidget並重新實現paintEvent()使用OpenGL和硬件加速? 我創建一個QPainter並在這個paintEvent()中繪製QImages。
QGLWidget的paintEvent()方法內發生了什麼?它是否將圖像(QImage,QPixmap)轉換爲OpenGL紋理?
它是否使用硬件加速進行圖像縮放?
由於提前, umanga
全部問候,QGLWidget和硬件加速?
是否簡單地繼承QGLWidget並重新實現paintEvent()使用OpenGL和硬件加速? 我創建一個QPainter並在這個paintEvent()中繪製QImages。
QGLWidget的paintEvent()方法內發生了什麼?它是否將圖像(QImage,QPixmap)轉換爲OpenGL紋理?
它是否使用硬件加速進行圖像縮放?
由於提前, umanga
看一看http://doc.qt.io/archives/4.6/opengl-2dpainting.html的一個有啓發意義的例子,你也可以找到下面的引用:「可以重新實現它的[QGLWidget] paintEvent()並使用QPainter在設備上繪圖,就像你一樣會有一個QWidget,唯一的區別是如果系統的OpenGL驅動程序支持,繪畫操作將在硬件中加速。「
所以,你的第一個問題的答案是肯定的。
搞清楚實施的具體細節,讓我們快速瀏覽一下從QOpenGLPaintEngine
一段源代碼(可通過搜索互聯網可以找到):
void QOpenGLPaintEngine::drawImage(const QRectF &r, const QImage &image,
const QRectF &sr, Qt::ImageConversionFlags)
{
Q_D(QOpenGLPaintEngine);
if (d->composition_mode > QPainter::CompositionMode_Plus
|| d->high_quality_antialiasing && !d->isFastRect(r))
d->drawImageAsPath(r, image, sr);
else {
GLenum target = (QGLExtensions::glExtensions
& QGLExtensions::TextureRectangle)
? GL_TEXTURE_RECTANGLE_NV
: GL_TEXTURE_2D;
if (r.size() != image.size())
target = GL_TEXTURE_2D;
d->flushDrawQueue();
d->drawable.bindTexture(image, target);
drawTextureRect(image.width(), image.height(), r, sr, target);
}
}
這回答了你的問題關於QImages,它們確實是使用紋理繪製的。
非常感謝格雷格!這清除了我的疑惑。 – 2010-07-02 01:15:52
開源的好處! – 2010-07-28 03:28:06
是的,如果你使用QGLWidget來繪圖內GL命令時,paintGL,resizeGL和initializeGL方法裏,你會得到完整的硬件加速(如果可用)。
似乎在QGLWidget中使用QPainter也會得到硬件加速,因爲有一個OpenGL QPainEngine實現,您可以閱讀有關該here。
看起來不太可能。從文檔 - 除了使用QPainter等繪製小部件的內容,而不是使用標準的OpenGL渲染命令。 – tathagata 2010-07-01 09:10:43
@tathagata:不幸的是,你錯了,儘管upvote;請閱讀我對這個問題的回答。 – 2010-07-01 13:06:56
感謝Greg,指出了這一點!我只是在做一個合乎邏輯的猜測。猜猜我錯了。 – tathagata 2010-07-01 13:44:53