का उपयोग करते समय 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 डी परिसंपत्तियों को त्रिभुजों में विभाजित करता है, इसका मतलब है कि क्यूपेन्टर के शेडर्स के पास मेरे प्रक्षेपण/परिवर्तन मैट्रिक्स तक पहुंच नहीं है, इसलिए मेरा लाल त्रिकोण शुरू हो गया है - लेकिन शायद कहीं ऑफस्क्रीन।
फिर भी प्रयास विफल के रूप में किसी अन्य बदलाव के लिए कोई जरूरत नहीं थी, 3 डी डेटा अप्रभावित है लेकिन QPainter डेटा प्रकट नहीं होता है। मैं सोच रहा हूं कि क्या यह एक पिक्सेल बफर को प्रस्तुत करने के लिए तेज़/आसान होगा, एक क्यूपेनटर में पृष्ठभूमि पिक्समैप के रूप में लोड करें, और फिर स्क्रीन पर ड्राइंग करने से पहले शीर्ष पर 'पेंट' करें? या यह लगता है कि इससे बहुत धीमा लगता है? – cmannett85
यदि आप 3 डी ड्राइंग नहीं करते हैं तो QPainter डेटा दिखाई देता है? – baysmith
मैंने पेंटएवेंट() फ़ंक्शन को केवल QPainter कॉल (जैसे दस्तावेज़ों में 2 डी पेंटिंग उदाहरण में) के साथ भर दिया है और स्क्रीन पर कुछ भी दिखाई नहीं देता है - विजेट को छोड़कर काला भरा हुआ है। – cmannett85