2011-01-26 15 views
9

में चार बाइट पैक करें मैं एक शेडर (एचएलएसएल) लिख रहा हूं, और मुझे R32 प्रारूप में रंग मान पैक करने की आवश्यकता है। मुझे R8G8B8A8 प्रारूप में एक फ्लोट पैक करने के लिए कोड के विभिन्न टुकड़े मिल गए हैं, लेकिन उनमें से कोई भी रिवर्स में काम नहीं कर रहा है। मैं एसएम 3.0 को लक्षित कर रहा हूं, इसलिए (afaik) बिट ऑपरेशंस एक विकल्प नहीं है।एक फ्लोट

float4 color = ...; // Where color ranges from 0 -> 1 
float packedValue = pack(color); 

किसी को भी पता है कि कैसे यह करने के लिए:

यह कुल मिलाकर, मैं यह करने के लिए सक्षम होना चाहिए?

अद्यतन
मैं कुछ प्रगति मिल गया है ... शायद इस प्रश्न को स्पष्ट करने में मदद मिलेगी।
मेरे अस्थायी समाधान है जैसे:

const int PRECISION = 64; 

float4 unpack(float value) 
{ 
    float4 color; 

    color.a = value % PRECISION; 
    value = floor(value/PRECISION); 

    color.b = value % PRECISION; 
    value = floor(value/PRECISION); 

    color.g = value % PRECISION; 
    value = floor(value/PRECISION); 

    color.r = value; 

    return color/(PRECISION - 1); 
} 

float pack(float4 color) 
{ 
    int4 iVal = floor(color * (PRECISION - 1)); 

    float output = 0; 

    output += iVal.r * PRECISION * PRECISION * PRECISION; 
    output += iVal.g * PRECISION * PRECISION; 
    output += iVal.b * PRECISION; 
    output += iVal.a; 

    return output; 
} 

मैं मूल रूप से कर रहा हूँ ... नाटक मैं पूर्णांक प्रकार उपयोग कर रहा हूँ: रों
अनुमान के माध्यम से और जाँच, 64 सबसे अधिक संख्या में, जबकि अभी भी बनाए रखने मैं इस्तेमाल कर सकते हैं था एक [0 ... 1] रेंज। दुर्भाग्य से, कि भी मतलब है मैं कुछ परिशुद्धता खो रहा हूँ - 8.

+2

यह अंततः पूछा जा रहा है, इसलिए आप इसे साथ भी प्राप्त कर सकते हैं :) आपको एक पूर्णांक प्रारूप के बजाय R32 का उपयोग क्यों करना है? – eodabash

+0

हे ... मुझे पता था कि यह आ रहा था, लेकिन फिर भी ... वास्तविकता में, मैं R32G32B32A32 का उपयोग कर रहा हूं, मैंने केवल आर 32 को सरल बनाने के लिए कहा है। मैं बस यह पता लगाने की कोशिश कर रहा हूं कि मैं एक ही रेंडर लक्ष्य में यथासंभव अधिक जानकारी कैसे डाल सकता हूं। बेशक, मुझे अभी भी कुछ माप करने की ज़रूरत है, लेकिन मुझे लगता है कि मेरे सभी डेटा को एक सिंगल रेंडर लक्ष्य में बदलना एमआरटी के माध्यम से चार का उपयोग करने से थोड़ा सस्ता है। – YellPika

+0

मैं यह देखने के लिए उत्सुक हूं कि इस प्रश्न के लिए लोग क्या जवाब दे सकते हैं। – Olhovsky

उत्तर

1

बजाय 6 बिट पर एक नज़र डालें: http://diaryofagraphicsprogrammer.blogspot.com/2009/10/bitmasks-packing-data-into-fp-render.html

संक्षिप्त उत्तर है कि यह में 4 तैरता की एक दोषरहित पैकिंग करने के लिए संभव नहीं है है 1 फ्लोट

भले ही आपको 4 फ्लोट्स पैक करने का कोई तरीका मिल जाए, अपने एक्सपोनेंट और महत्व को संग्रहित करें, पैकिंग और अनपॅकिंग प्रक्रिया निषिद्ध रूप से महंगा हो सकती है।

+1

वैसे, हकीकत में (और जैसा कि शीर्षक कहता है) मैं चार बाइट्स नहीं, चार बाइट पैक करने की कोशिश कर रहा हूं। मैंने पहले उस पोस्ट को देखा है। दुर्भाग्यवश कोड बिट ऑपरेटर का उपयोग करता है - SM3.0 का उपयोग नहीं होने वाला ... :( – YellPika

+0

आप बिट्सफिफ्ट को गुणा के साथ प्रतिस्थापित कर सकते हैं। जैसे 'x << 16'' x * = 2^16' – Olhovsky

+0

ओह जैसा ही है , हालांकि वह बिटमैस्क का उपयोग करता है। और आप SM3.0 में उपयोग नहीं कर सकते हैं। – Olhovsky

1

अपने घटकों को 3 घटकों के लिए एस = महत्व में पैक करने के लिए पसंद करें, और एक्सपोनेंट में अन्य घटक को पैक करने के लिए exp2 (color.g) (1 + s) करें। आप अभी भी सटीकता खो देंगे, लेकिन यह उतना बुरा नहीं होगा जितना कि आप सबकुछ को महत्व में पैक करने का प्रयास करते हैं और जैसा कि आप ऐसा करते हैं।

दुर्भाग्यवश, सटीक खोने से बचने का कोई तरीका नहीं है, क्योंकि नाएन और इंफ फ्लोट वैल्यू का एक समूह है जो दोनों एक-दूसरे से अलग नहीं हैं और संभवतः आपके जीपीयू द्वारा समर्थित नहीं हैं, और पुराने यह है)।

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