डिज़ाइन करना चूंकि मैंने ओपनजीएल सीखना शुरू कर दिया है, मैंने सोचा था कि मैं एक छोटी सी ++ फ्रेमवर्क (खुद के लिए) लिखूंगा क्योंकि मतली से बचने के लिए सी-आश कोड का अत्यधिक उपयोग स्पष्ट रूप से होता है। :)
चूंकि मैं क्यूटी के साथ रहना चाहता हूं, इसलिए ढांचा कुछ क्यूटी कक्षाओं का उपयोग करता है।एक शेडर क्लास
पहली चीज़ जो मुझे वास्तव में जरूरी थी वह शेडर्स और कार्यक्रमों का उपयोग करने का एक आसान तरीका था। शेडर वर्ग का मेरा विचार यहां है।
class Shader
{
public:
//create a shader with no source code
explicit Shader(GLenum shaderType);
//create a shader with source code and compile it
Shader(GLenum shaderType, const QString& sourceCode);
//create a shader from source file and compile it
Shader(GLenum shaderType, QFile& sourceFile);
~Shader();
//change the source code and recompile
void Source(QFile& sourceFile);
void Source(const QString& sourceCode);
GLuint get() const; //get the handle
private:
//common part for creation in different constructors
void createShader(GLenum shaderType);
//compile
void compile();
private:
GLuint handle;
};
यह स्पष्ट होना चाहिए कि विभिन्न कार्य क्या कर रहे हैं। प्रत्येक प्रासंगिक ओपनजीएल रूटीन को कॉल कर रहा है, त्रुटियों के लिए जांच करता है और किसी भी विफलता के मामले में अपवाद फेंकता है। कन्स्ट्रक्टर glCreateShader
पर कॉल करता है। अब मुश्किल हिस्सा है। विनाशक को glDeleteShader(handle);
पर कॉल करने की आवश्यकता है, लेकिन इस मामले में मुझे एक दुविधा है:
विकल्प 1: असाइनमेंट और प्रतिलिपि अक्षम करें। इसमें संदर्भ गिनती से बचने और नकारात्मक_पॉइंटर्स का उपयोग करने के लिए मजबूर होना पड़ता है ताकि वे इन्हें वैक्टर में रख सकें और सामान्य रूप से गुजर सकें।
विकल्प 2: संदर्भ गणना सक्षम करें। इसमें कॉपीिंग सक्षम करने का स्पष्ट उछाल है, और इसलिए कंटेनर में संग्रहित करना (जिसे बाद में मुझे प्रोग्राम में शेडर्स की एक श्रृंखला पारित करने की आवश्यकता होगी)।
Shader s1(GL_VERTEX_SHADER, QFile("MyVertexShader.vp"));
Shader s2(s1);
s2.Source(QFile("MyOtherVertexShader.vp"));
जैसा कि आप देख, मैं s2 के माध्यम से एस 1 के स्रोत बदल गया है, क्योंकि वे एक ही आंतरिक शेडर संभाल का हिस्सा: नकारात्मक पक्ष यह है निम्नलिखित है। ईमानदार होने के लिए, मुझे यहां एक बड़ी समस्या नहीं दिखाई दे रही है। मैंने कक्षा लिखी, इसलिए मुझे पता है कि इसकी प्रति-अर्थशास्त्र इस तरह हैं और मैं इसके साथ ठीक हूं। समस्या यह है कि मुझे यकीन नहीं है कि इस तरह का डिज़ाइन कभी स्वीकार्य है। यह सब विकल्प 1 + साझा पॉइंटर्स के साथ हासिल किया जा सकता है, केवल एक ही अंतर के साथ कि जब भी मैं एक शेडर बनाता हूं (प्रदर्शन कारणों के लिए नहीं - सिंटैक्टिक सुविधा के लिए) तो मैं एक साझा पॉइंटर नहीं चाहता हूं।
प्रश्न 1: कृपया विकल्पों और वैकल्पिक रूप से संपूर्ण विचार पर टिप्पणी करें।
Q2: अगर मैं विकल्प 2 का चयन करने के लिए गए थे, मैं इसे अपने आप को लागू करने के लिए है या वहाँ बढ़ावा या क्यूटी में एक तैयार वर्ग जो मैं से निकाले जाते हैं या के एक सदस्य हो सकता था है और मैं एक मिलेगा करना मुफ्त संदर्भ गिनती?
Q3: आप सहमत हैं कि Shader
एक अमूर्त वर्ग बनाने और तीन व्युत्पन्न वर्ग VertexShader
, FragmentShader
होने, और GeometryShader
overkill हो सकता है?
अगर तुम मुझे एक मौजूदा सी ++ ओपन ढांचे का संदर्भ लेना चाहिए, यह बहुत अच्छी बात है (के बाद से मैं वास्तव में एक नहीं मिला है) लेकिन यह है कि वास्तव में मेरे सवालों का जवाब की तुलना में एक ओर टिप्पणी किया जाना चाहिए । यह भी ध्यान रखें कि मैंने दस्तावेज़ों में कहीं भी QGLShader क्लास देखा है, लेकिन यह स्पष्ट रूप से क्यूटी के मेरे संस्करण में मौजूद नहीं है और मेरे पास अभी अपग्रेड करने से बचने के मेरे कारण हैं।
अद्यतन
जवाब के लिए धन्यवाद। मैंने अंततः स्रोत कार्यों को हटाकर अपने शेडर वर्ग को अपरिवर्तनीय बनाने का फैसला किया। शेडर को सृजन में संकलित किया जाता है और इसमें कोई गैर-आधार सदस्य-कार्य नहीं होता है। इस प्रकार एक साधारण संदर्भ गिनती एक ही समय में मेरी सभी समस्याओं को हल करती है।
एक सी ++ ओपन ढांचे आप (?) विज़ुअलाइज़ेशन लाइब्रेरी की जाँच हो सकता है के लिए। यह सभी मूलभूत बातों से लेकर एक मार्चिंग क्यूब्स ज्यामिति अल्गो तक सामान का एक टन प्रदान करता है। महान पुस्तकालय, कुछ जटिल लेकिन बहुत पूर्ण। http://www.visualizationlibrary.org – ssube
@peachykeen: मैं डॉक्स के माध्यम से देख रहा हूँ - प्रभावशाली लग रहा है! आपका बहुत बहुत धन्यवाद! –
लेखक भी अत्यंत संवेदनशील और सहायक है। विशेष रूप से खिड़की के साथ कुछ विषमताएं हैं, लेकिन यदि आपको कोई बग मिलती है और इसकी रिपोर्ट होती है, तो यह आमतौर पर सप्ताह के भीतर तय होती है (मेरे अनुभव में)। – ssube