2015-01-30 14 views
6

में कक्षाओं में नवीनतम ओपनजीएल कार्यों का उपयोग करके मैंने क्यूटी पर ओपनजीएल काम करने के तरीके के बारे में पहले एक प्रश्न पोस्ट किया था, लेकिन अब मैं ओपनजीएल के नवीनतम कार्यों का उपयोग करने में सक्षम होना चाहता हूं। क्यूटी से पहले, मैं glew का उपयोग कर रहा था; लेकिन क्यूटी कह रहा है कि glew अपनी QtOpenGL शीर्षलेख फ़ाइल के साथ विरोधाभासी है। मैंने QGLWidget और QGLFunctions में देखा, लेकिन स्पष्ट होने के लिए मैं उलझन में हूं कि ओपनजीएल के कार्यों तक पहुंचने के लिए मुझे वास्तव में क्या करना चाहिए।क्यूटी 5.4

अब, मुझे Qt निर्माता 3.3.0 का उपयोग कर Qt 5.4 मिला है और मैं नया QOpenGLWidget का उपयोग कर रहा हूं; हालांकि इसका उपयोग करने के तरीके में मार्गदर्शन की कमी मुझे थोड़ी दूर फेंक देती है: क्यूटी दस्तावेज वहां है और मदद करता है, लेकिन यह केवल कार्यक्रम के अन्य स्थानों में इसका उपयोग करने के बजाय इसे तुरंत चालू करने का तरीका दिखाता है। मैं समझता हूं कि यह QOpenGLWidget QGLWidget के समान कार्य करता है। क्यूटी का विवरण है कि मुझे इससे विरासत मिलनी चाहिए; हालांकि मैं कक्षा के भीतर ओपनजीएल संदर्भ को तत्काल नहीं कर रहा हूं, यह ओपनजीएल कार्यों का उपयोग करना चाहता है; यह कक्षा 'glwidget' में होता है, जो QOpenGLWidget से विरासत में मिलता है।

उदाहरण के लिए, मेरी कक्षाओं ओपन कोड का उपयोग करता है में से एक से इस अंश ले:

void Mesh::init() 
{ 
    pNumIndices = pIndices.size(); 

    glGenVertexArrays(1, &pVAO); 
    glGenBuffers(1, &pVertexBuffer); 
    glGenBuffers(1, &pIndexBuffer); 
    glBindVertexArray(pVAO); 

    glBindBuffer(GL_ARRAY_BUFFER, pVertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, pVertices.size() * sizeof(Vertex), 
       &pVertices[0], GL_STATIC_DRAW); 

    // etc.. 
} 

मेष एक वर्ग है कि कुछ भी से विरासत नहीं करता है। मूल रूप से, यह केवल glew का उपयोग किया जाता है ताकि यह ओपनजीएल कार्यों की घोषणा प्राप्त कर सके; यह जानने की जरूरत नहीं थी कि वे वैध थे या नहीं, क्योंकि यह गले का काम है। फिर मेनएप क्लास में, मैं तुरंत झुकाव करूँगा। मैं यह भी समझता हूं कि एक QOpenGLFunctions क्लास भी है जो कुछ हद तक काम करता है, लेकिन इन सभी जीएल वर्गों के साथ यह जानना बेहद उलझन में है कि इसका उपयोग कैसे किया जाए। और भी यह है कि मैंने glGenVertexArrays (..) की तलाश करने की कोशिश की लेकिन यह QOpenGLBuffer, QOpenGLFunctions या QOpenGLWidget में नहीं मिला है; और जहां तक ​​मुझे पता है, ओपनजीएल 4.5 के रूप में यह अभी भी spec का हिस्सा है; लेकिन मेरे ग्राफिक्स ड्राइवर ओपनजीएल 4.5 का उपयोग नहीं करते हैं, इसलिए मैं इसके बजाय ओपनजीएल 4.3 का उपयोग करता हूं। यह कहने के लिए पर्याप्त है कि मैं ओपनजीएल कार्यों को कॉल करने के लिए क्यूटी के अपने दृष्टिकोण को अपनाने के लिए तैयार हूं।

ऐसे कार्यक्रम में जहां विभिन्न कक्षाएं OpenGL फ़ंक्शंस का उपयोग कर रही हैं, मैं क्यूटी का उपयोग बिना उन्हें ग्लू के उपयोग के कॉल करने में सक्षम कैसे कर सकता हूं? मेष उन वर्गों में से एक है जो ओपनजीएल को तत्काल नहीं करता है, लेकिन केवल इसके कार्यों का उपयोग करता है।

बस इतना लोगों को पता है, मैं कुछ समय के लिए क्यूटी का उपयोग कर रहा हूं (हालांकि पर्याप्त नहीं!) और क्यूटी का आनंद लें; लेकिन मुझे यह जानने की जरूरत है कि मैं विकास जारी रखने के लिए ओपनजीएल के साथ क्यूटी का उपयोग कैसे कर सकता हूं। वहां के अधिकांश ट्यूटोरियल अभी भी प्री-5.4 सामान का उपयोग करते हैं।

struct sLGLAPI 
{ 
    sLGLAPI() { memset(this, 0, sizeof(*this)); }; 
    PFNGLACTIVETEXTUREPROC  glActiveTexture; 
    PFNGLATTACHSHADERPROC  glAttachShader; 
    PFNGLBEGINQUERYPROC   glBeginQuery; 
    PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; 
    ... 

संकेत dlsym ओपन साझा लाइब्रेरी का एड के साथ इसे भरें::

+1

'glGenVertexArrays' शिखर सरणी वस्तुओं के लिए है, इसलिए जरूरत है कक्षा का नाम क्या है जिसे आप ढूंढना चाहिए? यह सही है, ['QOpenGLVertexArrayObject'] (http://doc.qt.io/qt-5/qopenglvertexarrayobject.html)! – peppe

+0

मुझे व्यक्तिगत रूप से क्यू सामान पसंद नहीं है जहां यह ओपनजीएल सामग्री को केंद्रीय रूप से समाहित करता है। मैं अपने स्वयं के वर्गों के साथ खुद को इस तरह की चीजें करना पसंद करता हूं। – Poriferous

उत्तर

4

क्यूटी 5.4 में, वहाँ संस्करण विशिष्ट ओपन कार्य के साथ हेडर इसलिए कर रहे हैं,:

#include <QOpenGLFunctions_3_3_Core> 

या जो कुछ भी संस्करण आप उपयोग करना चाहते।तब QOpenGLWidget :: initializeGL की तरह एक वैध ओपन संदर्भ के साथ कहीं() बना सकते हैं और एक QOpenGLFunctions वस्तु आरंभ:

QOpenGLFunctions_3_3_Core *fun = new QOpenGLFunctions_3_3_Core; 
fun->initializeOpenGLFunctions(); 

और फिर अपने ड्रा कोड में, बस उस वस्तु से ओपन कार्यों का उपयोग:

fun->glSomething(1,2,3) 
+3

एक और विकल्प * विरासत * ऐसी कक्षा से है, इसलिए आप बस 'glSomething' लिख सकते हैं और यह काम करेगा। – peppe

+0

ठीक है, और यदि मेरे पास एक और वर्ग है जो QOpenGLWidget नहीं है लेकिन OpenGL 4.3 फ़ंक्शंस का उपयोग करता है, तो मैं तब क्या करूँ? – Poriferous

+0

एक QOpenGLFunctions_3_3_Core ऑब्जेक्ट बनाएं, या इससे प्राप्त करें। इसके बारे में कुछ भी QOpenGLWidget पर किसी भी तरह से निर्भर करता है। जब आप इसे init करते हैं तो आपको केवल एक वैध वर्तमान OpenGL संदर्भ की आवश्यकता होती है। – wrosecrans

1

ओपन के साथ स्पष्ट दृष्टिकोण समारोह संकेत युक्त एक संरचना बनाने के लिए है में

API->glActiveTexture = (PFNGLACTIVETEXTUREPROC)GetGLProc("glActiveTexture"); 
API->glAttachShader = (PFNGLATTACHSHADERPROC)GetGLProc("glAttachShader"); 
API->glBeginQuery = (PFNGLBEGINQUERYPROC)GetGLProc("glBeginQuery"); 
API->glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)GetGLProc("glBindAttribLocation"); 

और पहुँच ओपन अपने केवल इस संरचना के माध्यम से कोड।

API->glShaderSource(Shader, 1, &Code, nullptr); 
API->glCompileShader(Shader); 

इस तरह आप पूरा ओपन एपीआई छिपाने के लिए और भी ठूंठ कार्यों का उपयोग जहां आवश्यक हो, उदाहरण के लिए, पैरामीटर लॉग इन करने या ओपन और OpenGL ES के बीच स्विच करने में सक्षम हो जाएगा: उदाहरण के लिए।

+0

आपका समाधान उपयुक्त है; लेकिन डीएलएसआईएम केवल लिनक्स और इसी तरह के सिस्टम पर उपलब्ध है। मैं लिनक्स का भी उपयोग करता हूं; लेकिन मुझे विंडोज़ के तहत भी काम करने के लिए अपना कोड प्राप्त करना होगा। क्यूटी के पास इस तरह के कार्य को संभालने का एक बहुपक्षीय तरीका नहीं होगा? – Poriferous

+1

@Poriferous GetProcAddress dlsym – BlamKiwi

+0

के सबसे नज़दीकी चीज है यह समाधान नहीं है, जितना दिलचस्प लगता है; मुझे क्यूटी के साथ कुछ और सुसंगत चाहिए। – Poriferous

1
#include <QOpenGLFunctions_3_3_Core> 

class Mesh : public QOpenGLFunctions_3_3_Core 
{ 
public: 
    Mesh();//initializeOpenGLFunctions() 
    ~Mesh();  

    void func();//glxxx in it. when using it ,you need an opengl context. 
       //for example, use makeCurrent() in QOpenGLWidget subclass. 
}; 
1

QOpenGLFunctions_X_X_ * का उपयोग इस समस्या को हल नहीं करेगा! आप QOpenGLFunctions_X_X_ * का उपयोग करने से पहले ओपनजीएल संदर्भ के संस्करण को सेट करने की आवश्यकता है। क्यूटी डिफ़ॉल्ट संस्करण (मुझे लगता है कि 1.x) का उपयोग करें ताकि आप अपने main.cpp फ़ाइल में इस कोड को जोड़ना

 QSurfaceFormat format; 
//  format.setDepthBufferSize(24); 
    // format.setStencilBufferSize(8); 

     format.setMajorVersion(3); //whatever version 
     format.setMinorVersion(3); // 
     format.setProfile(QSurfaceFormat::CoreProfile); 
     QSurfaceFormat::setDefaultFormat(format); 

चीयर्स, नै

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