मैं अपने प्रोग्राम को GLfloat से GLshort में कशेरुक पदों के लिए कनवर्ट करने का प्रयास कर रहा हूं और मुझे यकीन नहीं है कि शेडर में इसका प्रतिनिधित्व कैसे किया जाए। मैं shader में एक vec3 डेटाटाइप का उपयोग कर रहा था, लेकिन vec3 3 फ्लोट का प्रतिनिधित्व करता है। अब मुझे 3 शॉर्ट्स का प्रतिनिधित्व करने की जरूरत है। जहां तक मैं ओपनजीएल को बता सकता हूं कि शॉर्ट्स के लिए वेक्टर नहीं है तो मुझे इस मामले में क्या करना चाहिए?GLfloat के बजाय GLfloat का उपयोग करने के लिए
उत्तर
मुझे यकीन नहीं है कि शेडर में इसका प्रतिनिधित्व कैसे किया जाए।
ऐसा इसलिए है क्योंकि यह जानकारी शेडर में नहीं रहती है।
glVertexAttribPointer
द्वारा प्रदान किए गए सभी मूल्य को फ़्लोटिंग-पॉइंट जीएलएसएल मानों में परिवर्तित कर देंगे (यदि वे पहले से ही फ़्लोट नहीं हैं)। यह रूपांतरण अनिवार्य रूप से मुफ़्त है। तो तुम एक vec4
विशेषता प्रकार इन glVertexAttribPointer
परिभाषाओं से किसी का उपयोग कर सकते हैं:
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, ...);
glVertexAttribPointer(0, 4, GL_UNSIGNED_SHORT, GL_TRUE, ...);
glVertexAttribPointer(0, 4, GL_SHORT, GL_TRUE, ...);
glVertexAttribPointer(0, 4, GL_SHORT, GL_FALSE, ...);
इन सभी परिवर्तित हो जाएगा एक vec4
स्वचालित रूप से में। आपके शेडर को यह जानना या देखभाल करना नहीं है कि इसे शॉर्ट्स, बाइट्स, इंटीजर, फ्लोट इत्यादि खिलाया जा रहा है।
पहला वाला उपयोग किया जाएगा। दूसरा दूसरा हस्ताक्षर किए गए शॉर्ट रेंज [0, 65535] को [0.0, 1.0] फ्लोटिंग-पॉइंट रेंज में परिवर्तित करेगा। तीसरा हस्ताक्षरित लघु श्रेणी [-32768, 32767] को [-1.0, 1.0] रेंज (though the conversion is a bit odd and differs for certain OpenGL versions, so as to allow the integer 0 to map to the floating point 0.0) में परिवर्तित करेगा। चौथाई [-32768, 32767] को [-32768.0, 32767.0] में एक फ़्लोटिंग-पॉइंट रेंज के रूप में परिवर्तित करेगा।
गुणों के लिए उपयोग किए जाने वाले जीएलएसएल प्रकार में केवल glVertexAttribIPointer
या glVertexAttribLPointer
का उपयोग होता है, इनमें से कोई भी OpenGL ES 2.0 में उपलब्ध नहीं है।
संक्षेप में: आपको हमेशा विशेषताओं के लिए फ़्लोट जीएलएसएल प्रकारों का उपयोग करना चाहिए। ओपनजीएल आपके लिए रूपांतरण करेगा।
- 1. GLint और GLfloat क्यों है?
- 2. केवल एक बनावट एटलस के चयन को दोहराने के लिए GL_REPEAT का उपयोग कैसे करें? (ओपनजीएल)
- 3. जब के बजाय ओवरराइड सी # नई उपयोग करने के लिए
- 4. org.jboss.resteasy.client.ClientRequest के बजाय उपयोग करने के लिए क्या करें?
- 5. एकाधिक विरासत के बजाय उपयोग करने के लिए डिज़ाइन पैटर्न
- 6. सूची समझ के बजाय उपयोग करने के लिए
- 7. लॉगबैक के बजाय log4j का उपयोग करने के लिए एक नई परियोजना के लिए कोई कारण?
- 8. '==' जावा स्ट्रिंग्स के लिए .equals के बजाय का उपयोग करना
- 9. फ़ोल्डर नाम का उपयोग करने के बजाय प्रोजेक्ट का नाम बदलने के लिए कैसे करें?
- 10. इंडेंटेशन के लिए टैब के बजाय रिक्त स्थान का उपयोग करने के प्रदर्शन प्रभाव
- 11. Convert e.printStackTrace() log4j का उपयोग करने के बजाय
- 12. हाइबरनेट में saveOrUpdate() का उपयोग करने के बजाय मौजूदा
- 13. CGPoint NSValue के लिए और रिवर्स
- 14. के बजाय अनचाहे अपवादों का उपयोग()?
- 15. memcache के बजाय cassandra का उपयोग कर?
- 16. WinForms के बजाय WPF का उपयोग शुरू करने के लिए सबसे अच्छी रीडिंग क्या हैं?
- 17. जावास्क्रिप्ट सरणी नई सरणी के बजाय [] का उपयोग करने के लिए सबसे अच्छा अभ्यास है?
- 18. इंटरपोलेशन के बजाय लॉग करने के लिए एकाधिक तर्कों का उपयोग क्यों करें?
- 19. जेएसलिंट मुझे "typeof ... === 'अपरिभाषित' के बजाय" === अपरिभाषित "का उपयोग करने के लिए क्यों कहता है?
- 20. hbm.xml का उपयोग करने के बजाय हाइबरनेट इकाइयों के लिए संकुल स्कैन कैसे करें?
- 21. सी ++: गेटर्स/सेटर्स लिखने के बजाय मित्र वर्गों का उपयोग करने के लिए खराब अभ्यास?
- 22. PHP php फ़ंक्शंस में निर्मित के बजाय filter_var का उपयोग करने के लिए
- 23. ऑटो कच्चे प्रकारों के बजाय जेनेरिक का उपयोग करने के लिए जावा स्रोत को परिवर्तित करें
- 24. बनावट डेटा प्राप्त करने के लिए glReadPixels के बजाय ओपनजीएल ES बनावट कैश का उपयोग
- 25. स्क्रिप्टिंग कार्यों के लिए सी # की बजाय डीएलआर-आधारित भाषा का उपयोग करने के कारण?
- 26. "लिंक के रूप में जोड़ें" का उपयोग करने के बजाय पोर्टेबल क्लास लाइब्रेरी का उपयोग करने का क्या फायदा है?
- 27. रूबी/रेल का उपयोग || मूल्य निर्धारित करने के लिए, एक शून्य मान के बजाय कोई रिक्त स्ट्रिंग का उपयोग कर
- 28. परिभाषित करने के बजाय def और defn का उपयोग करने के पीछे तर्क क्या है?
- 29. मुझे यह काम करने के लिए इंजेक्ट करने के बजाय .inject (0) का उपयोग करने की आवश्यकता क्यों है?
- 30. उपयोगकर्ता को एसएमएस का उपयोग करने के लिए मोबाइल ब्राउजर का उपयोग करने के लिए एसएमएस
मैं इस प्रभाव के तहत था कि मैं जवाब पढ़ने के बाद: http://stackoverflow.com/a/1316494/256062 और http://stackoverflow.com/a/5721102/256062 – Xavier
@Xavier: आप हैं बिंदु गुम है। आपके कशेरुक डेटा का आकार 'glVertexAttribPointer' द्वारा परिभाषित किया गया है, * नहीं * जीएलएसएल विशेषता चर। शेडर में छोटे घटकों का प्रतिनिधित्व करने के लिए आपको * आवश्यकता नहीं है *; हार्डवेयर * घटकों को छोटे घटकों से बड़े में परिवर्तित करेगा। –
@ निकोल-बोला हस्ताक्षरित डेटा प्रकारों के लिए, क्या आप सुनिश्चित हैं कि रूपांतरित श्रेणी उदाहरण के लिए है ('short')' [-32768, 32767] 'और '[-32767, 32767]' नहीं? यह [आलेख] (http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3), माना जाता है कि ऑरेंज बुक से लिया गया है, अलग-अलग सिखाता है। यह कहता है कि रूपांतरण हस्ताक्षरित प्रकारों के लिए सिर्फ एक विभाजन है। उस स्थिति में, लघु मूल्य '-32768' फ़्लोटिंग-पॉइंट जीएलएसएल मान' -32768/32767 = -1.000305185..' में परिवर्तित हो जाएगा। मुझे कल्पना में नहीं मिल सकता है कि यह निर्धारित करने के लिए कि कौन सा सही है। – wil