2012-06-12 16 views
9

में वांछित OpenGL संस्करण सेट नहीं कर सकता मैं QtL.8idget QTLWidget का उपयोग Qt 4.8.2 में करने का प्रयास कर रहा हूं। मैंने देखा कि डिफ़ॉल्ट संदर्भ QGLWidget बनाता है 3.1 से ऊपर OpenGL के लिए कोई आउटपुट नहीं दिखाता है। The Qt wiki has a tutorial जो एक साधारण त्रिकोण खींचने के लिए ओपनजीएल 3.3 का उपयोग करके प्रदर्शित करता है। जब मैं ट्यूटोरियल चलाने की कोशिश करता हूं, तो मुझे एक खाली स्क्रीन मिलती है। अगर मैं ओपनजीएल संस्करण को 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() enum सूची का वर्णन करता है समर्थित ओपन संस्करणों। सूची से पता चलता है कि मैं ओपनजीएल/ईएस संस्करणों को छोड़कर सभी प्रकारों का समर्थन करता हूं। तीसरी पंक्ति पर QFlags() प्रारूप विकल्पों का वर्णन करता है (अल्फा चैनल, स्टैंसिल बफर, आदि)।

कोई भी जानता है कि क्यों QGLWidget कुछ भी> = 3.1 के साथ काम नहीं करेगा? मैं लिनक्स पर हूं, एनवीडिया जीटी 440 है, और ग्लैक्सइन्फो से पता चलता है कि यह ओपनजीएल 4.2.0 का समर्थन करता है। ड्राइवर संस्करण ऊपर नमूना आउटपुट में मुद्रित है। मुझे यकीन नहीं है कि और क्या प्रयास करें।

संपादित करें: मैंने इस संपादन से पहले समस्या के बारे में मेरी व्याख्या के साथ कुछ बहुत बुरी गलतियों/धारणाएं की हैं। मुद्दा अभी भी समान है, लेकिन उम्मीद है कि अब थोड़ा और समझ में आता है। किसी भी भ्रम के लिए खेद है।

+0

क्या आपके शेडर्स संकलित/लिंकिंग कर रहे हैं? यदि आप 4.2 संदर्भ और असंगत/गलत शेडर्स का उपयोग कर रहे हैं, तो यह एक खाली विंडो के लिए एक कारण है। –

+0

मुझे अब तक (शेडर्स) नहीं मिला है। मैं QGLWidget को QDeclarativeView के व्यूपोर्ट के रूप में उपयोग करना चाहता था और उसके बाद शेडर्स का उपयोग करने वाली कुछ 3 डी सामग्री जोड़ना चाहता था। लेकिन एक आयत जैसे डिफ़ॉल्ट घटकों के साथ एक साधारण फ़ाइल {} कुछ भी प्रस्तुत नहीं करती है।अगर मैं QGLFormat संस्करण सेट नहीं करता हूं तो यह उम्मीद के रूप में प्रस्तुत किया जाएगा, लेकिन इस सवाल का पूरा बिंदु यह पता लगा रहा है कि मैं इसे पहले स्थान पर क्यों सेट नहीं कर सकता। इसके अलावा, अगर मैं (या आंतरिक रूप से क्यूटी) असंगत शेडर्स का उपयोग कर रहा था तो मुझे त्रुटियां मिलेंगी। एकमात्र आउटपुट वह है जो मैंने अपने प्रश्न में चिपकाया था। – Prismatic

+0

हम्म, एकमात्र कारण है कि मैं शेडर लॉग को देखने का सुझाव देता हूं, यह है कि ओपनजीएल 3.0 + की आवश्यकता है कि आपके स्वयं के शेडर्स संकलित और लोड हो जाएं, जबकि ओपनजीएल 2.0 और नीचे नहीं है। मेरे पास क्यूटी के माध्यम से ओपनजीएल का उपयोग करने का कोई प्रयोग नहीं है, इसलिए मुझे नहीं पता कि आपके लिए कितना संभाला जाता है। हालांकि, उदाहरण के साथ, लेखक ने अपने स्वयं के शेडर्स तैयार किए हैं। यदि आप मूल प्रोफ़ाइल का उपयोग कर ग्राफिक्स कार्ड पर शेडर्स प्रदान नहीं करते हैं, तो आप कुछ भी प्रस्तुत नहीं करेंगे। –

उत्तर

4

आपको mainView.show(); के बाद ओपनजीएल प्रश्नों को नीचे ले जाना चाहिए। show() से पहले ओपनजीएल संदर्भ शुरू नहीं किया गया है।

2

लघु संस्करण: Qt5 पर अपडेट, यह तय है।

पीएस और यदि आप 5.4 का उपयोग कर सकते हैं तो आपको शायद QTOpenGL ... वर्गों के बजाय QGL ... वर्गों का उपयोग करना चाहिए।

लंबा संस्करण: तो, अगर किसी को भी इस तरह की समस्या आती है।

मैंने अपने इंटेल एचडी 3000 के साथ ओबंटू 14.04 और क्यूटी 4.8.6 पर ओपनजीएल 3.0 संदर्भ बनाने की कोशिश की। मैं जवाब के अंत में प्रदान किए गए इस टेस्ट कोड के साथ आया था। 3.1, 1.2, 2.1 .. आदि का प्रयास करने के लिए कोर संगत संदर्भ .. लेकिन हमेशा context->format().majorVersion() के साथ अनुरोधित संस्करण दिखा रहा है, और glGetString(GL_VERSION) 3.0 दिखा रहा है।

लगभग 3 घंटों के बाद मैंने देखा कि डिफ़ॉल्ट रूप से क्यूटी निर्माता मेरे सिस्टम पर स्थापित हालिया क्यूटी 5 के बजाय क्यूटी 4 का उपयोग करता है। और जब मैंने क्यूटी 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(); 
} 
संबंधित मुद्दे