संपादित करें: कृपया मेरे अन्य जवाब को एक ठोस समाधान के साथ देखें।
मैंने अपने गुरु की थीसिस के लिए वास्तव में एक साल पहले इस सटीक समस्या को हल किया है। वाल्व पेपर में, वे दिखाते हैं कि आप इसे प्राप्त करने के लिए और दो दूरी के क्षेत्र में काम कर सकते हैं, जो तब तक काम करता है जब तक आपके पास केवल एक उत्तल कोने हो। अवतल कोनों के लिए, आपको OR ऑपरेशन की भी आवश्यकता है। इस आदमी ने वास्तव में चार बनावट चैनलों का उपयोग करके दो संचालन के बीच स्विच करने के लिए कुछ अस्पष्ट प्रणाली विकसित की।
हालांकि, एक बहुत सरल ऑपरेशन है जो दोनों और या स्थिति के आधार पर सुविधा प्रदान कर सकता है, और यह मेरी थीसिस का मुख्य विचार है: तीन का माध्य । तो मूल रूप से, आप बिल्कुल तीन चैनलों (RGB के लिए आदर्श) का उपयोग करते हैं, जो पूरी तरह से विनिमेय हैं, और उन्हें माध्यियन ऑपरेशन का उपयोग करके संयोजित करें (तीन में से मध्य मान चुनें)।
एंटी-अलियासिंग को समायोजित करने के लिए, हम केवल बूलियन के साथ काम नहीं करते हैं, लेकिन फ्लोटिंग पॉइंट वैल्यू, और AND ऑपरेशन न्यूनतम हो जाता है, और OR अधिकतम दो मान बन जाता है। तीन की औसत वास्तव में दोनों कर सकते हैं: अगर एक < b , के लिए ( एक , एक , ख ), मंझला न्यूनतम है, और के लिए ( एक , ख , ख ), यह सबसे अधिक है।
प्रतिपादन की प्रक्रिया अभी भी बेहद सरल है। एंटी-अलियासिंग सहित संपूर्ण खंड shader कुछ इस तरह दिख सकता है:
int main() {
// Bilinear sampling of the distance field
vec3 s = texture2D(sdf, p).rgb;
// Acquire the signed distance
float d = median(s.r, s.g, s.b) - 0.5;
// Weight between inside and outside (anti-aliasing)
float w = clamp(d/fwidth(d) + 0.5, 0.0, 1.0);
// Combining the background and foreground color
gl_FragColor = mix(outsideColor, insideColor, w);
}
तो मूल विधि से एकमात्र अंतर बनावट के नमूने के बाद माध्यिका की गणना कर रहा है। आपको माध्यिका फ़ंक्शन को लागू करना होगा, जो कि केवल 4 मिनट / अधिकतम ऑपरेशन के साथ किया जा सकता है ।
अब, निश्चित रूप से, सवाल यह है कि मैं इस तरह के तीन-चैनल दूरी क्षेत्र का निर्माण कैसे करूं?और यह मुश्किल हिस्सा है। सबसे स्पष्ट दृष्टिकोण जो मैंने शुरुआत में लिया था, वह इनपुट शेप / ग्लिफ़ के तीन घटकों में अपघटन करना था, और फिर प्रत्येक से एक पारंपरिक दूरी क्षेत्र उत्पन्न करना था। इस अपघटन के नियम इतने जटिल नहीं हैं। सबसे पहले, 3 में से कम से कम 2 चैनल वाला क्षेत्र अंदर है। फिर, यदि आप इसे आरजीबी रंग चैनलों के रूप में कल्पना करते हैं, तो उत्तल कोनों को द्वितीयक रंग से बनाया जाना चाहिए, और इसके दो प्राथमिक घटक बाहर की ओर जारी रहते हैं। अवतल कोने उलटे होते हैं: दो माध्यमिक रंग अपने सामान्य प्राथमिक रंग को संलग्न करते हैं, और दोनों किनारों के बीच की कील सफेद होती है। मैंने यह भी पाया कि कुछ पैडिंग आवश्यक है जहां दो प्राथमिक या दो माध्यमिक रंग अन्यथा कलाकृतियों से बचने के लिए स्पर्श करेंगे (उदाहरण के लिए, "एन" के मध्य स्ट्रोक में)
निम्नलिखित छवि मेरी थीसिस से कार्यक्रम द्वारा उत्पन्न एक उदाहरण अपघटन है:
इस दृष्टिकोण में हालांकि कुछ कमियां हैं। उनमें से एक यह है कि विशेष प्रभाव, जैसे कि रूपरेखा और छाया अब सही ढंग से काम नहीं करेंगे। Fortunatelly, मैं एक दूसरी, बहुत अधिक सुरुचिपूर्ण पद्धति के साथ आया, जो सीधे दूरी के क्षेत्रों को उत्पन्न करती है, और यहां तक कि सभी ग्राफिकल प्रभावों का भी समर्थन करती है। यह मेरी थीसिस में भी शामिल है और इसलिए यह एक साल से अधिक पुराना भी है। मैं अभी कोई और विवरण नहीं देने जा रहा हूं, क्योंकि मैं वर्तमान में एक पेपर लिख रहा हूं जो इस दूसरी तकनीक का विस्तार से वर्णन करता है, लेकिन मैं इसे समाप्त होते ही यहां पोस्ट करूंगा।
वैसे भी, यहाँ गुणवत्ता में अंतर का एक उदाहरण है। प्रत्येक छवि में बनावट रिज़ॉल्यूशन समान है, लेकिन बाईं ओर एक नियमित बनावट का उपयोग किया जाता है, बीच वाला एक साधारण दूरी के क्षेत्र का उपयोग करता है, और दाईं ओर मेरे तीन-चैनल दूरी क्षेत्र का उपयोग करता है। प्रदर्शन ओवरहेड केवल एक आरजीबी बनावट बनाम एक मोनोक्रोम एक के नमूने के बीच का अंतर है।