2013-02-19 22 views
9

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

एक साधारण खिलौना उदाहरण के रूप में, मान लीजिए कि मेरे पास एक टेक्सल है जिसमें 16 बिट पूर्णांक है। मैं इस पाठ में 1 बिट प्रत्येक के दो बूलियन, एक 10 बिट पूर्णांक मान और उसके बाद 4 बिट पूर्णांक मान को एन्कोड करना चाहता हूं। क्या बनावट बनाते समय इसे एन्कोड करने की कोई तकनीक है, और उसके बाद जीएलएसएल शेडर का उपयोग कर बनावट को नमूना करते समय इन घटकों को डीकोड करें?

संपादित करें: ऐसा लगता है कि मैं वास्तव में थोड़ा हेरफेर तकनीक की तलाश में हूं। चूंकि वे समर्थित हैं, इसलिए कुछ और शोध के बाद मुझे ठीक होना चाहिए।

+0

क्या आप थोड़ा हेरफेर करने के लिए पूछ रहे हैं? –

+0

जीएलएसएल 1.3 (ओपनजीएल 3.0) में बिट मैनिपुलेशन संभव है, मुझे नहीं पता कि आप जीएलएसएल में बनावट से कच्चे int को कैसे पढ़ सकते हैं ... Texture2D रिटर्न वीसी 4 –

+0

@ निकोलबोलस: कुछ और खोज के बाद, ऐसा लगता है मैं हूँ। मैंने इतना नहीं किया है, इसलिए मुझे यकीन नहीं था। यदि जीएलएसएल इसका समर्थन करता है, तो मुझे यह पता लगाने में सक्षम होना चाहिए कि इसके बारे में कहां से शुरू करना है! –

उत्तर

3

जीएलएसएल शेडर्स के अंदर इंटीजर और बिट-मैनिपुलेशन ओपनजीएल 3 के बाद से समर्थित हैं (इस प्रकार डीएक्स 10 क्लास हार्डवेयर पर मौजूद है, यदि यह आपको और बताता है)। तो आप शेडर के अंदर अपने आप पर इस बिट मेन्यूलेशन कर सकते हैं।

लेकिन पूर्णांक के साथ काम करना एक बात है, उन्हें बनावट से बाहर लेना एक और है। मानक ओपनजीएल बनावट प्रारूप (जिसका उपयोग आप किया जा सकता है) या तो सीधे फ्लोट को संग्रहीत कर रहे हैं (जैसे GL_R16F) या सामान्यीकृत निश्चित बिंदु मान (जैसे GL_R16, अनियमित के लिए प्रभावी रूप से पूर्णांक;), लेकिन उनसे पढ़ने (texture, texelFetch या जो कुछ भी) आप शेडर में मूल्यों को फ़्लोट करेंगे, जिससे आप आंतरिक रूप से संग्रहीत पूर्णांक के मूल बिट-पैटर्न को आसानी से या विश्वसनीय रूप से कम नहीं कर सकते हैं।

तो आपको वास्तव में उपयोग करने की आवश्यकता है एक पूर्णांक बनावट है, जिसके लिए ओपनजीएल 3 भी आवश्यक है (या शायद GL_EXT_texture_integer एक्सटेंशन, लेकिन हार्डवेयर सहायक जो संभवतः जीएल 3 होगा)। तो आपके बनावट के लिए आपको एक वास्तविक पूर्णांक आंतरिक प्रारूप का उपयोग करने की आवश्यकता है, जैसे उदा। GL_R16UI (1-घटक 16-बिट हस्ताक्षरित पूर्णांक के लिए) सामान्य निश्चित बिंदु स्वरूपों (जैसे GL_R16 सामान्यीकृत [0,1] रंग के लिए 16 बिट्स परिशुद्धता के साथ) के आधार पर।

और फिर शेडर में आपको एक पूर्णांक नमूना प्रकार का उपयोग करने की आवश्यकता है, जैसे उदा। एक अहस्ताक्षरित पूर्णांक 2 डी बनावट के लिए usampler2D (और इसी तरह isampler... पर हस्ताक्षर किए वेरिएंट के लिए) वास्तव में अपने texture या texelFetch कॉल से एक अहस्ताक्षरित पूर्णांक प्राप्त करने के लिए:

सीपीयू:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, ..., GL_R, GL_UNSIGNED_SHORT, data); 

GPU:

uniform usampler2D tex; 

... 
uint value = texture(tex, ...).r; 
bool b1 = (value&0x8000) == 0x8000, 
    b2 = (value&0x4000) == 0x4000; 
uint i1 = (value>>4) & 0x3FF, 
    i2 = value & 0xF; 
+0

हाय, कि glTexImage2D मेरे लिए एक त्रुटि लौट रहा है, क्या आप कृपया एक नज़र डालें? http://stackoverflow.com/questions/21625709/jogl-creating-only-red-channel-u16-but-getting-texture-type-and-format-combina – elect

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