2012-07-26 17 views
6

मैं अपने प्रोग्राम को GLfloat से GLshort में कशेरुक पदों के लिए कनवर्ट करने का प्रयास कर रहा हूं और मुझे यकीन नहीं है कि शेडर में इसका प्रतिनिधित्व कैसे किया जाए। मैं shader में एक vec3 डेटाटाइप का उपयोग कर रहा था, लेकिन vec3 3 फ्लोट का प्रतिनिधित्व करता है। अब मुझे 3 शॉर्ट्स का प्रतिनिधित्व करने की जरूरत है। जहां तक ​​मैं ओपनजीएल को बता सकता हूं कि शॉर्ट्स के लिए वेक्टर नहीं है तो मुझे इस मामले में क्या करना चाहिए?GLfloat के बजाय GLfloat का उपयोग करने के लिए

उत्तर

16

मुझे यकीन नहीं है कि शेडर में इसका प्रतिनिधित्व कैसे किया जाए।

ऐसा इसलिए है क्योंकि यह जानकारी शेडर में नहीं रहती है।

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 में उपलब्ध नहीं है।

संक्षेप में: आपको हमेशा विशेषताओं के लिए फ़्लोट जीएलएसएल प्रकारों का उपयोग करना चाहिए। ओपनजीएल आपके लिए रूपांतरण करेगा।

+0

मैं इस प्रभाव के तहत था कि मैं जवाब पढ़ने के बाद: http://stackoverflow.com/a/1316494/256062 और http://stackoverflow.com/a/5721102/256062 – Xavier

+0

@Xavier: आप हैं बिंदु गुम है। आपके कशेरुक डेटा का आकार 'glVertexAttribPointer' द्वारा परिभाषित किया गया है, * नहीं * जीएलएसएल विशेषता चर। शेडर में छोटे घटकों का प्रतिनिधित्व करने के लिए आपको * आवश्यकता नहीं है *; हार्डवेयर * घटकों को छोटे घटकों से बड़े में परिवर्तित करेगा। –

+0

@ निकोल-बोला हस्ताक्षरित डेटा प्रकारों के लिए, क्या आप सुनिश्चित हैं कि रूपांतरित श्रेणी उदाहरण के लिए है ('short')' [-32768, 32767] 'और '[-32767, 32767]' नहीं? यह [आलेख] (http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3), माना जाता है कि ऑरेंज बुक से लिया गया है, अलग-अलग सिखाता है। यह कहता है कि रूपांतरण हस्ताक्षरित प्रकारों के लिए सिर्फ एक विभाजन है। उस स्थिति में, लघु मूल्य '-32768' फ़्लोटिंग-पॉइंट जीएलएसएल मान' -32768/32767 = -1.000305185..' में परिवर्तित हो जाएगा। मुझे कल्पना में नहीं मिल सकता है कि यह निर्धारित करने के लिए कि कौन सा सही है। – wil

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