2010-11-30 14 views
9

का उपयोग करते समय QGLWidget में ओपनजीएल पर QPainter का उपयोग करना आप में से कई Qt (4.6 विशेष रूप से) उपयोगकर्ता ओपनजीएल ट्यूटोरियल्स में प्रदान किए गए ओवरपेनटिंग उदाहरण से परिचित होंगे, मैं कुछ ऐसा ही करने की कोशिश कर रहा हूं लेकिन शुद्ध ओपनजीएल के लिए शेडर्स का उपयोग कर रहा हूं पुरानी फिक्स्ड-फ़ंक्शन पाइपलाइन की बजाय डेटा।शेडर्स

// Set background and state. 
makeCurrent(); 
qglClearColor(bgColour_); 

glEnable(GL_DEPTH_TEST); 
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 

if (smoothLines_) { 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_LINE_SMOOTH); 
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); 
} 

// Clear the buffers. 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glUseProgram(shader_); 

// Draw the grid. 
try { 
    glLineWidth(2.0f); 
    manager_->setColour(centreColour_); 
    grid_->draw(oE_GLGrid::Centre); 

    glLineWidth(1.5f); 
    manager_->setColour(majorColour_); 
    grid_->draw(oE_GLGrid::Major); 

    glLineWidth(1.0f); 
    manager_->setColour(minorColour_); 
    grid_->draw(oE_GLGrid::Minor); 
} catch(oE_GLException& e) { 
    cout << "OpenGL Error: " << e.what() << endl; 
    return; 
} 

// Reset OpenGL state for overlays. 
glDisable(GL_DEPTH_TEST); 
if (smoothLines_) { 
    glDisable(GL_BLEND); 
    glDisable(GL_LINE_SMOOTH); 
} 

// Draw the overlays. 
QPainter p(this); 
p.beginNativePainting(); 
p.fillRect(10, 10, 100, 100, 
     QColor(255, 0, 0)); 
p.endNativePainting(); 

मैं एक 3 डी संपत्ति आवेदन बना रहा हूं इसलिए ग्रिड सामान। जब यह काम करता है तो इसे वास्तव में स्पष्ट बनाने के लिए, विजेट के ऊपरी बाएं कोने में एक बड़ा लाल आयत दिखाना चाहिए - लेकिन ऐसा नहीं होता है।

3 डी ठीक काम करता है, लेकिन QPainter स्क्रीन पर कुछ भी नहीं मिलता है। मेरा और डॉक्स के बीच एकमात्र वास्तविक अंतर यह है कि सभी प्रक्षेपण और परिवर्तन मैट्रिक्स गणना अन्य कार्यों में छिपी हुई हैं और फिर glUniform के माध्यम से शेडर पर अपलोड की गई हैं। संभवतः क्यूपेन्टर 2 डी परिसंपत्तियों को त्रिभुजों में विभाजित करता है, इसका मतलब है कि क्यूपेन्टर के शेडर्स के पास मेरे प्रक्षेपण/परिवर्तन मैट्रिक्स तक पहुंच नहीं है, इसलिए मेरा लाल त्रिकोण शुरू हो गया है - लेकिन शायद कहीं ऑफस्क्रीन।

उत्तर

10

ओपनजीएल कॉल करने से पहले कॉलनेटनेटिंग() शुरू करें। ओपनजीएल राज्य का एक ग्लशश/पॉप भी आवश्यक हो सकता है। की तरह कुछ प्रयास करें निम्नलिखित:

QPainter p(this); 
p.beginNativePainting(); 

// Maybe necessary 
glPushAttrib(GL_ALL_ATTRIB_BITS); 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

// Put OpenGL code here 

// Necessary if used glPush-es above 
glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 
glMatrixMode(GL_MODELVIEW); 
glPopMatrix(); 
glPopAttrib(); 

p.endNativePainting(); 

p.fillRect(10, 10, 100, 100, 
     QColor(255, 0, 0)); 
+0

फिर भी प्रयास विफल के रूप में किसी अन्य बदलाव के लिए कोई जरूरत नहीं थी, 3 डी डेटा अप्रभावित है लेकिन QPainter डेटा प्रकट नहीं होता है। मैं सोच रहा हूं कि क्या यह एक पिक्सेल बफर को प्रस्तुत करने के लिए तेज़/आसान होगा, एक क्यूपेनटर में पृष्ठभूमि पिक्समैप के रूप में लोड करें, और फिर स्क्रीन पर ड्राइंग करने से पहले शीर्ष पर 'पेंट' करें? या यह लगता है कि इससे बहुत धीमा लगता है? – cmannett85

+0

यदि आप 3 डी ड्राइंग नहीं करते हैं तो QPainter डेटा दिखाई देता है? – baysmith

+0

मैंने पेंटएवेंट() फ़ंक्शन को केवल QPainter कॉल (जैसे दस्तावेज़ों में 2 डी पेंटिंग उदाहरण में) के साथ भर दिया है और स्क्रीन पर कुछ भी दिखाई नहीं देता है - विजेट को छोड़कर काला भरा हुआ है। – cmannett85

1

मैं मजबूत बनाने और स्पष्ट है कि मैं क्या सच समाधान, cmannet85 द्वारा पाया के रूप में मानते को यह उत्तर पोस्ट कर रहा हूँ, जो करने के लिए है (baysmith ऊपर से जवाब देने के लिए टिप्पणी) QPainter कोड को कॉल करने से पहले ओपनजीएल वर्टेक्स बफर बाइंडिंग को साफ़ करें।

मुझे लगभग समान समस्या थी, जिसमें मुझे QPainter फ़ंक्शंस और ओपनजीएल फ़ंक्शंस का उपयोग करने के बीच स्विच करने की आवश्यकता थी। cmannet85 पता चला, एक कारण यह है कि यदि ओपनजीएल फ़ंक्शन बाएं वर्टेक्स बफर को पीछे छोड़ देते हैं, तो वे ओपनजीएल के क्यूपेनटर के उपयोग में हस्तक्षेप करते हैं।

मैं सभी मेरे ओपन ES 2.0 कोड के कुछ हिस्सों जो glBindBuffer कहा जाता है के अंत में इस बयान को जोड़कर इस समस्या को ठीक करने में सक्षम था:

glBindBuffer(GL_ARRAY_BUFFER,0); 

0 का एक दूसरा पैरामीटर बफर unbinds।

इस तरह, beginNativePainting ... endNativePainting के लिए कॉल जोड़ने आदि

संबंधित मुद्दे