तीनों के पक्ष / विपक्ष क्या हैं?
तीनों के पक्ष / विपक्ष क्या हैं?
जवाबों:
कोडरंग HLSL के बारे में सही है जो DirectX को लक्षित कर रहा है, GLSL OpenGL और CG को लक्षित कर रहा है जो दोनों इंटरफेस के साथ उपलब्ध है।
हालाँकि विचार करने के लिए अन्य चीजें हैं (OGRE मंच पर सीखी गई):
इसलिए, यदि आप नवीनतम शेडर सुविधाओं का उपयोग नहीं कर रहे हैं, तो CG एक अच्छा विकल्प है। यदि आप पूर्ण OpenGL जा रहे हैं, तो GLSL एक दांव लगता है। एचएलएसएल यदि आप विशेष रूप से Microsoft प्लेटफार्मों पर जा रहे हैं।
अब पहले HLX में विंडोज़ के लिए DirectX का उपयोग करने के लिए एचएलएसएल में विकसित करना और फिर लिनक्स और मैक के लिए GLSL में परिवर्तित करना प्रदर्शन का सुनिश्चित होना बेहतर समाधान हो सकता है और इसमें शैडर सुविधाओं का बड़ा सेट उपलब्ध है। हालांकि यह बहुत काम हो सकता है (यह मैंने खुद नहीं किया था इसलिए मैं नहीं बता सकता)। OGRE ग्राफिक्स इंजन (और अन्य इंजन) किसी भी एपीआई (डायरेक्टएक्स या ओपनजीएल या अन्य) का उपयोग करने की अनुमति देता है, इसलिए यह मदद करता है, लेकिन अगर आप इस तरह से जाते हैं तो कन्वर्ट करने के लिए अभी भी shader कोड है।
वह सभी जानकारी जो मैंने अपनी shader भाषा को चुनते समय एकत्रित की थी (मैंने अभी तक अपना निर्णय नहीं लिया है)।
अद्यतन: वाल्व ने अपने खेल में से एक को ओपनजीएल में बदल दिया और ओएनजीसी एक की तुलना में डायरेक्टएक्स संस्करण को तेज बनाने का कोई तरीका नहीं मिला । तो ध्यान रखें कि ड्राइवर कार्यान्वयन, एपीआई गुणवत्ता, आदि की स्थिति, जो कि प्रत्येक वर्ष आपके लिए पूरी तरह से एक या दूसरे को चुनने के तर्क के रूप में कच्चे प्रदर्शन पर निर्भर होने के लिए बहुत अधिक बदलती है। इसे ध्यान में रखते हुए, विंडोज के अलावा अन्य प्लेटफार्मों के साथ काम करते समय (या योजना बनाने या काम करने की उम्मीद) अपने जीवन को आसान बनाने के लिए ओपनजीएल / जीएलएसएल चुनें, डायरेक्टएक्स / एचएलएसएल का उपयोग करें यदि आप वास्तव में केवल माइक्रोसॉफ्ट प्लेटफार्मों का उपयोग करना चाहते हैं और ध्यान केंद्रित करना चाहते हैं और शायद कुछ अच्छे हैं OpenGL की तुलना में एपीआई तेजी से (यह अब उलट है, इसलिए उस पर भरोसा मत करो); यदि आप उपयोगकर्ता को दोनों संभावनाएँ प्रदान करना चाहते हैं तो CG का उपयोग करें, लेकिन यदि आपके पास इसे करने के लिए कार्य बल (और उपकरण) हैं, तो GLSL और HLSL दोनों का उपयोग करना एक व्यवहार्य समाधान भी हो सकता है।
अद्यतन (2012): यह ध्यान रखना महत्वपूर्ण है कि सीजी को बंद कर दिया गया है, और अब एनवीडिया द्वारा समर्थित या सक्रिय रूप से काम नहीं किया गया है। एनवीडिया की सिफारिश है कि सभी उपयोगकर्ता जीएलएसएल और एचएलएसएल के संयोजन पर स्विच करें, या एक नया पुस्तकालय जैसे कि एनवीएफएक्स (जीथब पर)। ऐसा इसलिए है क्योंकि GLSL और HLSL के बीच फ़ीचर-अनुकूलता बनाए रखना बहुत मुश्किल था।
मैं केवल सीजी बनाम एचएलएसएल के बारे में बात कर सकता हूं क्योंकि वे 2 हैं जो मैंने अब तक उपयोग किए हैं।
Cg है नहीं HLSL के रूप में ही।
Cg में, NVIDIA ने एक बहुत ही साफ-सुथरे शेडर सिंटैक्स बनाने में एक उत्कृष्ट काम किया। यह एचएलएसएल के समान है।
लेकिन , D3D9 / D3D11 (init कोड, shader संकलन कोड) के साथ टाई-सीजी के साथ HLSL पर बहुत साफ है । -1 सीजी। Cg में स्टार्ट अप कोड का एक बुरा सा हिस्सा है जो आपको D3D से अधिक एचएलएसएल के लिए भी आवश्यक नहीं है।
Cg में, आपको हर उस uniform
shader वैरिएबल के लिए "cgGetNamedParameter" करना होगा जिसे आप सेट / संशोधित करना चाहते हैं। और आपको CGparameter
उस चर के लिए अपने कोड में एक संदर्भ बनाए रखना होगा
// C++ code to interact with Cg shader variable (shader language independent)
CGparameter mvp = cgGetNamedParameter( vs, "modelViewProj" );
CG::getLastError("Getting modelViewProj parameter"); // check for errors
cgSetMatrixParameterdr( mvp, &modelViewProj._11 ) ; // setting the matrix values
एचएलएसएल में, यह बहुत साफ होता है - सिर्फ एक लाइन, और आपको उस CGparameter
वैरिएबल को बनाए रखने की जरूरत नहीं है ।
// D3D9 C++ code to interact with HLSL shader variable
DX_CHECK( id3dxEffect->SetMatrix("modelViewProj", &mvp._11 ), "Set matrix" ) ;
उपरोक्त में, DX_CHECK
बस एक साधारण फ़ंक्शन है जो SetMatrix
कॉल से वापस आने वाले HRESULT की जांच करता है । उपरोक्त कोड d3d9 है । D3D10 और 11, निश्चित रूप से, बहुत अधिक दर्दनाक हैं (क्योंकि वहाँ कोई ID3DX11Effect ऑब्जेक्ट नहीं है)।
इससे पहले कि मैं एचएलएसएल का उपयोग करना शुरू करूँ, मैं इस कोड को देखता था और वास्तव में ईर्ष्या करता था ।
हालांकि NVIDIA ओपन के बीच छग / D3D के लिए एक आम इंटरफेस बनाने के लिए, व्यावहारिक रूप से इसके बोल अपना सर्वश्रेष्ठ किया था नहीं कि जिस तरह से है, और तुम हो cgGL*
, cgD3D9
, cgD3D10
,cgD3D11
समारोह समूहों का सामना करने के लिए। ताकि OpenGL और D3D के लिए पूरे काम करता है !! दावा केवल इतना ही जाता है। आपको अभी भी OpenGL / D3D #ifdef
प्रकार समूहों में सब कुछ लपेटना है ताकि इसे विभिन्न प्लेटफार्मों पर काम किया जा सके। -2 सी.जी.
इसके अलावा मुझे हाल ही में Cg / ATI कार्ड के साथ एक बुरा अनुभव हुआ है, जो मुझे यकीन है कि मेरा बुरा नहीं है। (कोई और इसे आज़माता है?)। मुझे लगता है कि यह सच हो सकता है कि NVIDIA पूरी तरह से एटीआई कार्ड का परीक्षण नहीं करता है, जैसा कि केलेम का दावा है। या कि अति Cg पर परीक्षण नहीं करता है। एक तरह से या दूसरे, वहाँ एक बेमेल है और हितों के संघर्ष के कुछ प्रकार है। -3 सीजी।
सभी सभी में मैंने Cg को प्राथमिकता दी। इसका shader कोड वाक्यविन्यास और नामकरण साफ, मीठा और सुव्यवस्थित है। इसका बहुत बुरा इसका अन्य समस्याओं को मिला।
मेरी बहुत बुनियादी समझ यह है कि HLSL केवल DirectX के लिए है और GLSL केवल OpenGL के लिए है। सीजी मूल रूप से एचएलएसएल के समान भाषा है, लेकिन इसका उपयोग डायरेक्टएक्स या ओपनजीएल (हालांकि अलग-अलग रनटाइम कोड के माध्यम से) के साथ किया जा सकता है।
एचएलएसएल और जीएलएसएल के बीच एक और महत्वपूर्ण अंतर (मैं सीजी नहीं जानता, इसलिए मैं इसके लिए बोल नहीं सकता) यह है कि एचएलएसएल माइक्रोसॉफ्ट डी 3 डी रनटाइम के हिस्से के रूप में शेडर कंपाइलर प्रदान करता है जबकि जीएलएसएल के साथ आपका हार्डवेयर विक्रेता इसे उनके हिस्से के रूप में प्रदान करता है। चालक।
इसके दोनों तरफ फायदे और नुकसान हैं।
GLSL विधि के साथ विक्रेता कंपाइलर को उनके हार्डवेयर की क्षमताओं के लिए ट्यून कर सकते हैं। वे अपने स्वयं के हार्डवेयर को सबसे अच्छा जानते हैं, वे जानते हैं कि क्या करना है और क्या नहीं करना है। दूसरी ओर नुकसान यह है कि - एक ऐसी दुनिया में जहां कई हार्डवेयर विक्रेता हैं - आपके पास एक ऐसी स्थिति है जिसमें shader संकलक के बीच असंगतताएं हो सकती हैं, और विक्रेता के पास भी स्क्रू करने के लिए पूर्ण स्वतंत्र शासन है।
HLSL विधि के साथ Microsoft कंपाइलर को नियंत्रित करता है। हर कोई एक सुसंगत तकनीकी आधार पर है, और यदि एक शेडर सफलतापूर्वक एक ही स्थान पर संकलित करता है, तो उसे हर जगह संकलित करना उचित माना जा सकता है। एक ही shader वेंडर की परवाह किए बिना एक ही संकलित आउटपुट का उत्पादन करेगा (अन्य सभी चीजें पाठ्यक्रम के बराबर हो रही हैं)। दूसरी ओर एचएलएसएल कंपाइलर को "हर चीज पर लगातार काम करता है" होना चाहिए, इसलिए यह टैंक से रस की आखिरी कुछ बूंदों को प्राप्त करने के लिए किसी विशेष विक्रेता-विशिष्ट चाल को खींचने में सक्षम नहीं है।
अगर ऐसा लगता है जैसे मुझे दुनिया के एचएलएसएल को देखने के लिए एक प्राथमिकता है क्योंकि यह है क्योंकि मैं करता हूं। मुझे विभिन्न प्लेटफार्मों पर बेतहाशा असंगत व्यवहार से पहले बुरी तरह से काट लिया गया है, और एक मामले में भी समाप्त हो गया है कि केवल काम करने के लिए एक बेसलाइन प्राप्त करने के लिए ARB ASM में GLSL के लोड को रोल करना है। NVIDIA के GLSL कंपाइलर को यहां विशेष रूप से कुख्यात के रूप में देखा जा सकता है - यह HLSL सिंटैक्स और कीवर्ड को भी स्वीकार करेगा, जिसका अर्थ है कि यदि आप सावधान नहीं हैं तो आप ऐसे प्रोडक्शन शेड को समाप्त कर सकते हैं जो केवल NVIDIA पर काम करेंगे और कुछ नहीं। यह एक जंगल है।
आप RTSS (रन टाइम शेडर सिस्टम) को देखना चाहते हैं जो ओग्रे के साथ भी आता है। यह काफी नया है, लेकिन आप मूल रूप से बाहरी फ़ाइलों के बजाय कोड में शेड लिखते हैं। मैंने इसे अभी तक लागू नहीं किया है, लेकिन निश्चित रूप से समय आने पर इसका उपयोग करने की योजना बना रहा हूं।
यहाँ ओग्रे विकि पर ट्यूटोरियल की एक विशाल श्रृंखला है और साथ ही साथ शेडर्स लिखने के लिए भी। http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide
आपके मूल प्रश्न के लिए, जैसे कि प्रेटोर ने कहा, वास्तव में यह पेशेवरों / विपक्षों का मामला नहीं है, यह मामला है कि आप क्या प्रतिपादन प्रणाली का उपयोग करना चाहते हैं। चूंकि Ogre के साथ DX / OpenGL का उपयोग करना केवल प्लगइन लोड करने की बात है, आप सबसे अधिक संभावना .cg प्रारूप का उपयोग करना चाहेंगे।