एचएलएसएल बनाम जीएलएसएल बनाम सीजी के पेशेवरों और विपक्ष क्या हैं? [बन्द है]


61

तीनों के पक्ष / विपक्ष क्या हैं?


2
ऐसा लगता है कि आपको पहले यह तय करने की आवश्यकता होगी कि आप किस एपीआई के लिए जा रहे थे (ओजीएल या डीएक्स) और इससे पहले कि आप क्या शेडर भाषा तय करते हैं।
तेतराड

1
मुझे लगता है कि यह सवाल शानदार है। कैसे एक समुदाय विकि के बारे में? मैं यह सब करने के लिए नया हूँ और shaders के लिए मतभेदों का एक सवाल बिल्कुल वही है जो मुझे जानना आवश्यक है।
म्लादेन मिहाजलोविच

3
सुधार: "बंद के रूप में रचनात्मक नहीं" कहना चाहिए "के रूप में बंद करना dimwit नीति", क्योंकि यह आईएस रचनात्मक है।
लेनार्ट रोलैंड

जवाबों:


42

कोडरंग HLSL के बारे में सही है जो DirectX को लक्षित कर रहा है, GLSL OpenGL और CG को लक्षित कर रहा है जो दोनों इंटरफेस के साथ उपलब्ध है।

हालाँकि विचार करने के लिए अन्य चीजें हैं (OGRE मंच पर सीखी गई):

  • CG आपको GLSL की नवीनतम विशेषताओं का उपयोग करने की अनुमति नहीं देगा (मैं HLSL के बारे में निश्चित नहीं हूं)। यह एक बीच का मैदान है, इसलिए आप GLSL सुविधाओं का पूरी तरह से उपयोग नहीं कर पाएंगे, केवल आम एक ही जब तक कि Shader Model 3.0 (AFAI समझ में न आए)।
  • CG को NVidia द्वारा बनाया गया है जो इसे कार्ड के लिए ऑप्टिमाइज़ करता है लेकिन ATI कार्ड के लिए बहुत काम नहीं करता है ... कुछ लोग रिपोर्ट करते हैं कि CG का उपयोग करते हुए ATI कार्ड के साथ समस्या हो सकती है।
  • OpenGL विंडोज प्लेटफॉर्म पर DirectX की तुलना में थोड़ा धीमा लगता है। यह वास्तव में आप क्या कर रहे हैं के सापेक्ष है और इसका कारण यह है कि ड्राइवरों के कार्यान्वयन में इसका स्रोत है, लेकिन एपीआई और संबंधित shader भाषा चुनने से पहले यह जानना अच्छा है। हालाँकि, OpenGL सभी (जीत / मैक / यूनिक्स / कुछ कंसोल) प्लेटफार्मों पर उपलब्ध एकमात्र इंटरफ़ेस है। तो यह जानते हुए कि, विशेष रूप से GLSL का उपयोग करना गैर-माइक्रोसॉफ़्ट-केंद्रित-क्रॉस-प्लेटफ़ॉर्म गेम के लिए बेहतर विकल्प हो सकता है।
  • Linux पर NVidia ड्राइवर अति चालकों की तुलना में अधिक स्थिर प्रतीत होते हैं, जिससे CG को अधिक रोचक बना दिया जाता है यदि आपको यह सुनिश्चित करने की आवश्यकता है कि यह linux पर अच्छी तरह से काम करता है (यह सभी रिपोर्ट किए गए सुझाव हैं, तो आपको विवरण की जांच करनी होगी)

इसलिए, यदि आप नवीनतम शेडर सुविधाओं का उपयोग नहीं कर रहे हैं, तो CG एक अच्छा विकल्प है। यदि आप पूर्ण OpenGL जा रहे हैं, तो GLSL एक दांव लगता है। एचएलएसएल यदि आप विशेष रूप से Microsoft प्लेटफार्मों पर जा रहे हैं।

अब पहले HLX में विंडोज़ के लिए DirectX का उपयोग करने के लिए एचएलएसएल में विकसित करना और फिर लिनक्स और मैक के लिए GLSL में परिवर्तित करना प्रदर्शन का सुनिश्चित होना बेहतर समाधान हो सकता है और इसमें शैडर सुविधाओं का बड़ा सेट उपलब्ध है। हालांकि यह बहुत काम हो सकता है (यह मैंने खुद नहीं किया था इसलिए मैं नहीं बता सकता)। OGRE ग्राफिक्स इंजन (और अन्य इंजन) किसी भी एपीआई (डायरेक्टएक्स या ओपनजीएल या अन्य) का उपयोग करने की अनुमति देता है, इसलिए यह मदद करता है, लेकिन अगर आप इस तरह से जाते हैं तो कन्वर्ट करने के लिए अभी भी shader कोड है।

वह सभी जानकारी जो मैंने अपनी shader भाषा को चुनते समय एकत्रित की थी (मैंने अभी तक अपना निर्णय नहीं लिया है)।


अद्यतन: वाल्व ने अपने खेल में से एक को ओपनजीएल में बदल दिया और ओएनजीसी एक की तुलना में डायरेक्टएक्स संस्करण को तेज बनाने का कोई तरीका नहीं मिला । तो ध्यान रखें कि ड्राइवर कार्यान्वयन, एपीआई गुणवत्ता, आदि की स्थिति, जो कि प्रत्येक वर्ष आपके लिए पूरी तरह से एक या दूसरे को चुनने के तर्क के रूप में कच्चे प्रदर्शन पर निर्भर होने के लिए बहुत अधिक बदलती है। इसे ध्यान में रखते हुए, विंडोज के अलावा अन्य प्लेटफार्मों के साथ काम करते समय (या योजना बनाने या काम करने की उम्मीद) अपने जीवन को आसान बनाने के लिए ओपनजीएल / जीएलएसएल चुनें, डायरेक्टएक्स / एचएलएसएल का उपयोग करें यदि आप वास्तव में केवल माइक्रोसॉफ्ट प्लेटफार्मों का उपयोग करना चाहते हैं और ध्यान केंद्रित करना चाहते हैं और शायद कुछ अच्छे हैं OpenGL की तुलना में एपीआई तेजी से (यह अब उलट है, इसलिए उस पर भरोसा मत करो); यदि आप उपयोगकर्ता को दोनों संभावनाएँ प्रदान करना चाहते हैं तो CG का उपयोग करें, लेकिन यदि आपके पास इसे करने के लिए कार्य बल (और उपकरण) हैं, तो GLSL और HLSL दोनों का उपयोग करना एक व्यवहार्य समाधान भी हो सकता है।


अद्यतन (2012): यह ध्यान रखना महत्वपूर्ण है कि सीजी को बंद कर दिया गया है, और अब एनवीडिया द्वारा समर्थित या सक्रिय रूप से काम नहीं किया गया है। एनवीडिया की सिफारिश है कि सभी उपयोगकर्ता जीएलएसएल और एचएलएसएल के संयोजन पर स्विच करें, या एक नया पुस्तकालय जैसे कि एनवीएफएक्स (जीथब पर)। ऐसा इसलिए है क्योंकि GLSL और HLSL के बीच फ़ीचर-अनुकूलता बनाए रखना बहुत मुश्किल था।


2
जी हां । NVIDIA एटीआई कार्ड के साथ समस्याओं के बारे में परवाह नहीं करता है।
बोबोबो

4
"OpenGL विंडोज प्लेटफॉर्म पर DirectX की तुलना में थोड़ा धीमा लगता है।" ज्यादातर मामलों में यह आमतौर पर ओपनगैल वाले ड्राइवरों के लिए विक्रेता के समर्थन के कारण होता है जो विंडोज पर उतना अच्छा नहीं है जितना कि डायरेक्टएक्स के साथ है।
क्रिस सी पी

1
नोट: मैंने हाल के सुधारों के कारण ओपन / जीएलएसएल को चुना और यह सुनिश्चित करने की आवश्यकता है कि मेरा गेम कुछ गैर-एमएस टैबलेट्स पर काम करता है।
क्लेम

2
@Community: क्या आपके पास Cg के लिए समर्थन बंद करने के लिए कोई लिंक है?
निकोल बोलस


15

मैं केवल सीजी बनाम एचएलएसएल के बारे में बात कर सकता हूं क्योंकि वे 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 कोड वाक्यविन्यास और नामकरण साफ, मीठा और सुव्यवस्थित है। इसका बहुत बुरा इसका अन्य समस्याओं को मिला।


10

मेरी बहुत बुनियादी समझ यह है कि HLSL केवल DirectX के लिए है और GLSL केवल OpenGL के लिए है। सीजी मूल रूप से एचएलएसएल के समान भाषा है, लेकिन इसका उपयोग डायरेक्टएक्स या ओपनजीएल (हालांकि अलग-अलग रनटाइम कोड के माध्यम से) के साथ किया जा सकता है।


+1 यह मेरी समझ के साथ-साथ व्यक्तिगत रूप से भी है जब भी मैं cg का उपयोग करना पसंद करता हूं, लेकिन यह रेंडर सिस्टम से परे एक अतिरिक्त निर्भरता जोड़ता है; और मुझे लगता है कि कुछ और अधिक जटिल प्रभावों के साथ OpenGL, cg और ATI ड्राइवरों के साथ कुछ अजीब मुद्दे याद आते हैं ...
रिले एडम्स

मैं Ogre का उपयोग कर रहा हूं और इस प्रकार मेरे पास तीनों उपलब्ध हैं, लेकिन अगर मुझे डायरेक्टएक्स और ओपनजीएल दोनों चाहिए तो मुझे या तो एचएलएसएल और जीएलएसएल या सिर्फ सीजी दोनों में शेडर्स लिखना होगा? क्या वह सही है?
21

14
-1। यह एक बहुत ही अल्पविकसित उत्तर है और इस साइट पर अधिक व्यापक जानकारी प्राप्त करने की उम्मीद है।
बोबोबो

2
-1: मैं बॉबोबो से सहमत हूं।
निकोल बोलस

1
दुर्भाग्य से मुझे बोबोबो के समान कारणों से -1 करना है।
जोनाथन डिकिंसन

8

एचएलएसएल और जीएलएसएल के बीच एक और महत्वपूर्ण अंतर (मैं सीजी नहीं जानता, इसलिए मैं इसके लिए बोल नहीं सकता) यह है कि एचएलएसएल माइक्रोसॉफ्ट डी 3 डी रनटाइम के हिस्से के रूप में शेडर कंपाइलर प्रदान करता है जबकि जीएलएसएल के साथ आपका हार्डवेयर विक्रेता इसे उनके हिस्से के रूप में प्रदान करता है। चालक।

इसके दोनों तरफ फायदे और नुकसान हैं।

GLSL विधि के साथ विक्रेता कंपाइलर को उनके हार्डवेयर की क्षमताओं के लिए ट्यून कर सकते हैं। वे अपने स्वयं के हार्डवेयर को सबसे अच्छा जानते हैं, वे जानते हैं कि क्या करना है और क्या नहीं करना है। दूसरी ओर नुकसान यह है कि - एक ऐसी दुनिया में जहां कई हार्डवेयर विक्रेता हैं - आपके पास एक ऐसी स्थिति है जिसमें shader संकलक के बीच असंगतताएं हो सकती हैं, और विक्रेता के पास भी स्क्रू करने के लिए पूर्ण स्वतंत्र शासन है।

HLSL विधि के साथ Microsoft कंपाइलर को नियंत्रित करता है। हर कोई एक सुसंगत तकनीकी आधार पर है, और यदि एक शेडर सफलतापूर्वक एक ही स्थान पर संकलित करता है, तो उसे हर जगह संकलित करना उचित माना जा सकता है। एक ही shader वेंडर की परवाह किए बिना एक ही संकलित आउटपुट का उत्पादन करेगा (अन्य सभी चीजें पाठ्यक्रम के बराबर हो रही हैं)। दूसरी ओर एचएलएसएल कंपाइलर को "हर चीज पर लगातार काम करता है" होना चाहिए, इसलिए यह टैंक से रस की आखिरी कुछ बूंदों को प्राप्त करने के लिए किसी विशेष विक्रेता-विशिष्ट चाल को खींचने में सक्षम नहीं है।

अगर ऐसा लगता है जैसे मुझे दुनिया के एचएलएसएल को देखने के लिए एक प्राथमिकता है क्योंकि यह है क्योंकि मैं करता हूं। मुझे विभिन्न प्लेटफार्मों पर बेतहाशा असंगत व्यवहार से पहले बुरी तरह से काट लिया गया है, और एक मामले में भी समाप्त हो गया है कि केवल काम करने के लिए एक बेसलाइन प्राप्त करने के लिए ARB ASM में GLSL के लोड को रोल करना है। NVIDIA के GLSL कंपाइलर को यहां विशेष रूप से कुख्यात के रूप में देखा जा सकता है - यह HLSL सिंटैक्स और कीवर्ड को भी स्वीकार करेगा, जिसका अर्थ है कि यदि आप सावधान नहीं हैं तो आप ऐसे प्रोडक्शन शेड को समाप्त कर सकते हैं जो केवल NVIDIA पर काम करेंगे और कुछ नहीं। यह एक जंगल है।


1
निष्पक्ष होने के लिए, एनवीआईडीआईए के जीएलएसएल संकलक ने उन दिनों के बारे में और अधिक सख्त हो गया है और उन दिनों से स्वीकार नहीं करता है। लेकिन आज भी, मुझे "एनवीआईडीआईए ट्रैप्स" कहा जाता है जो ऐसा कुछ करना आसान बनाता है जो आपको लगता है कि आपको काम करना चाहिए, लेकिन वास्तविक कल्पना और एएमडी ड्राइवरों के अनुसार नहीं।
निकोल बोलस

मैं यहां तक ​​कहूंगा कि एटीआई / एएमडी पर विकसित हो रहा है, या नियमित आधार पर एटीआई / एएमडी के साथ बहुत कम क्रॉस-चेकिंग अभी भी एक निरपेक्ष है। एक की कीमत के लिए आपको दो हत्याएं मिलेंगी क्योंकि आप उनके ओपनगिल ड्राइवर में भी कीड़े पकड़ेंगे।
मैक्सिमस मिनिमस

SPIR-V का समर्थन करने वाले Vulkan, या OpenGL कार्यान्वयन को लक्षित करते समय, GLSL शेड्स को SPIR-V के लिए पूर्व-संकलित किया जा सकता है।
एंड्रिया

@ और - हाँ, यह सही है; स्पष्ट रूप से न तो वल्कन और न ही SPIR-V उस समय मौजूद थे जब सवाल पूछा गया था (और asnwer लिखा गया था)।
मैक्सिमस मिनिमस

1

मैं दोनों का उपयोग कर रहा हूं, मैंने glsl के साथ शुरुआत की और केवल hlsl में चला गया क्योंकि परियोजना इसकी मांग करती है। पसंद को देखते हुए, यह सभी तरह से glsl है। glsl बहुत चालाक लगता है और hlsl ऐसा महसूस करता है कि यह एक इंजीनियर की शौक़ीन बेंच से निकला है।


1

आप RTSS (रन टाइम शेडर सिस्टम) को देखना चाहते हैं जो ओग्रे के साथ भी आता है। यह काफी नया है, लेकिन आप मूल रूप से बाहरी फ़ाइलों के बजाय कोड में शेड लिखते हैं। मैंने इसे अभी तक लागू नहीं किया है, लेकिन निश्चित रूप से समय आने पर इसका उपयोग करने की योजना बना रहा हूं।

यहाँ ओग्रे विकि पर ट्यूटोरियल की एक विशाल श्रृंखला है और साथ ही साथ शेडर्स लिखने के लिए भी। http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide

आपके मूल प्रश्न के लिए, जैसे कि प्रेटोर ने कहा, वास्तव में यह पेशेवरों / विपक्षों का मामला नहीं है, यह मामला है कि आप क्या प्रतिपादन प्रणाली का उपयोग करना चाहते हैं। चूंकि Ogre के साथ DX / OpenGL का उपयोग करना केवल प्लगइन लोड करने की बात है, आप सबसे अधिक संभावना .cg प्रारूप का उपयोग करना चाहेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.