2012-06-12 33 views
9

我試圖使用Qt 4.8.2使用QGLWidget來繪圖設定所需的OpenGL版本。我注意到QGLWidget創建的默認上下文不會顯示任何3.1以上的OpenGL輸出。 The Qt wiki has a tutorial,演示如何使用OpenGL 3.3繪製一個簡單的三角形。當我嘗試運行教程時,我得到一個空白屏幕。如果我將OpenGL版本更改爲3.1,我會得到預期的輸出(一個紅色三角形)。不能在QGLWidget來繪圖

我的視頻卡支持OpenGL 4.2,並且在創建QGLWidget之前調用QGLFormat::openGLVersionFlags()表明Qt檢測到OpenGL 4.2和所有以前的桌面版本。

下面是另一個小例子:

#include <QApplication> 
#include <QGLWidget> 
#include <QDebug> 
#include <QtDeclarative/qdeclarativeview.h> 

int main(int argc, char * argv[]) 
{ 
    QApplication app(argc, argv); 

    qDebug() << "OpenGL Versions Supported: " << QGLFormat::openGLVersionFlags(); 

    QGLFormat qglFormat; 
    qglFormat.setVersion(4,2); // get expected output with (3,1) and below, else blank window 
    qglFormat.setProfile(QGLFormat::CoreProfile); 
    qglFormat.setSampleBuffers(true); 

    QGLWidget* qglWidget = new QGLWidget(qglFormat); 

    QString versionString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION)))); 
    qDebug() << "Driver Version String:" << versionString; 
    qDebug() << "Current Context:" << qglWidget->format(); 

    QDeclarativeView mainView; 
    mainView.setViewport(qglWidget); 
    mainView.setSource(QString("helloworld.qml")); 
    mainView.show(); 

    return app.exec(); 
} 

下面是輸出:

OpenGL Versions Supported: QFlags(0x1|0x2|0x4|0x8|0x10|0x20|0x40|0x1000|0x2000|0x4000|0x8000|0x10000) 
Driver Version String: "4.2.0 NVIDIA 295.53" 
Current Context: QGLFormat(options QFlags(0x1|0x2|0x4|0x10|0x20|0x80|0x200|0x400) , plane 0 , depthBufferSize 24 , accumBufferSize 16 , stencilBufferSize 8 , redBufferSize 8 , greenBufferSize 8 , blueBufferSize 8 , alphaBufferSize -1 , samples 4 , swapInterval 0 , majorVersion 4 , minorVersion 2 , profile 1) 

在第一行的QFlags()枚舉列表描述支持的OpenGL版本。該列表顯示我支持除OpenGL/ES版本之外的所有變體。第三行的QFlags()描述了格式選項(alpha通道,模板緩衝區等)。

誰知道爲什麼QGLWidget來繪圖將不與任何> = 3.1的工作?我在Linux上,有一個Nvidia GT440,glxinfo顯示它支持OpenGL 4.2.0。驅動程序版本打印在上面的示例輸出中。我不太確定還有什麼可以嘗試的。

編輯:我用我的這個編輯前的問題作了解釋一些非常嚴重的錯誤/假設。這個問題仍然類似,但希望現在更有意義。對不起,有任何困惑。

+0

您的着色器是編譯/鏈接?如果您使用的是4.2環境和不兼容/不正確的着色器,那是造成空白窗口的原因之一。 –

+0

我還沒有得到那麼多(着色器)。我想使用QGLWidget作爲QDeclarativeView的視口,然後添加一些使用着色器的3D內容。但即使是像Rectangle {}這樣的默認組件的簡單文件也不會呈現任何內容。它會呈現如預期,如果我不設置QGLFormat版本,但這個問題的整點是搞清楚爲什麼我不能把它擺在首位。另外,如果我(或Qt內部)使用不兼容的着色器,我會得到錯誤。唯一的輸出是我粘貼在我的問題。 – Prismatic

+0

嗯,所以我建議您查看着色器日誌的唯一原因,是OpenGL 3.0的+要求自己的着色器編譯和裝載,而的OpenGL 2.0及以下沒有。我沒有通過QT使用OpenGL的經驗,所以我不知道爲您處理了多少。然而,在你鏈接的例子中,作者準備他或她自己的着色器。如果您不使用核心配置文件向顯卡提供着色器,則不會渲染任何內容。 –

回答

4

你應該移動的OpenGL mainView.show();後查詢了下來。在show()之前,OpenGL上下文尚未初始化。

2

短版:更新QT5,它是固定在那裏。

P.S如果你可以用5.4,你應該使用QtOpenGL ...類,而不是QGL ...的。

長版本: 因此,萬一有人遇到類似這樣的問題。

我試圖在Ubuntu 14.04和Qt 4.8.6與我的英特爾HD3000創建NOT OpenGL 3.0的範圍內。我想出了答案末尾提供的這個測試代碼。嘗試創建3.1,1.2,2.1 ..等上下文Core Compatible ..但總是以context->format().majorVersion()顯示請求的版本,並且glGetString(GL_VERSION)顯示3.0。

約3小時後,我注意到,在默認情況下Qt Creator中使用的Qt4,而不是最近的Qt 5中,安裝在我的系統上。在我用Qt 5.2.1重新編譯項目之後,完全相同的代碼開始按預期工作。

希望這可以幫助別人。

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    MainWindow w; 
    w.show(); 

    QGLFormat glFormat; 
    glFormat.setVersion(3, 1); 
    glFormat.setProfile(QGLFormat::NoProfile); 
    glFormat.setSampleBuffers(true); 
    glFormat.setDefaultFormat(glFormat); 
    glFormat.setSwapInterval(1); 
    QGLWidget widget(glFormat); 
    widget.makeCurrent(); 

    const QGLContext *context = widget.context(); 

    glewExperimental = GL_TRUE; 
    if (glewInit() != GLEW_OK) { 
     qWarning("Failed to initialize GLEW\n"); 
    } 
    qDebug() << "Context valid: " << context->isValid(); 
    qDebug() << "Really used OpenGl: " << context->format().majorVersion() << "." << context->format().minorVersion(); 
    qDebug() << "OpenGl information: VENDOR:  " << (const char*)glGetString(GL_VENDOR); 
    qDebug() << "     RENDERDER: " << (const char*)glGetString(GL_RENDERER); 
    qDebug() << "     VERSION:  " << (const char*)glGetString(GL_VERSION); 
    qDebug() << "     GLSL VERSION: " << (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION); 
    qDebug() << "endstuff\n"; 

    return a.exec(); 
}