2013-01-05 98 views
7

मैं एक अच्छा ढाल प्रभाव चाहता हूं। लेकिन मिनट में यह वास्तव में पैची है और आप दो त्रिकोणों के बीच एक प्रतीत देख सकते हैं। मेरे पास निम्नलिखित शेडर्स वर्ट और फ्रैग हैं। एकमात्र चीज जो मैं सोच सकता हूं वह प्री-जेनरेटेड बनावट में स्वैप करना है।ओपनजीएल 3.2 जीएलएसएल ब्लॉककी इंटरपोलेशन

डेटा दो त्रिकोणों के लिए फ्लोट [x y] [आर जी बी] के रूप में बफ किया गया है, मुझे नहीं लगता कि सी ++ स्रोत दिखने लायक है।

VERT #version 330

layout(location = 0) in vec2 position;  
layout(location = 1) in vec3 incolor; 

smooth out vec3 color; 

void main() 
{ 
    color = incolor; 
    gl_Position = vec4(position.x,position.y,0.0,1.0); 
} 

frag #version 330

smooth out vec4 outputColor; 
smooth in vec3 color; 

void main() 
{ 
    outputColor = vec4(vec3(color),1.0); 
} 

परिणाम blocky

एकल त्रिकोण को देखते हुए ब्लॉक वाले सत्ता enter image description here

से पता चलता
+0

आप मिल सकती है आपको मिल कशेरुक और टुकड़े टुकड़े के बीच एक tex-coord में interpolated रंग चिपकाने से अधिक सटीकता। – JasonD

+1

@ जेसनडी: "टेक्स्ट-समन्वय" जैसी कोई चीज़ नहीं है; केवल उपयोगकर्ता परिभाषित इंटरपोलेटेड मान हैं। –

+0

@Andrew: आप कैसे जानते हैं कि यह एक इंटरपोलेशन समस्या है और आपके प्रदर्शन बिटडिप, स्क्रीन, या आप इसे कैसे देख रहे हैं के साथ कोई समस्या नहीं है? –

उत्तर

6

रैखिक इंटरपोलेशनक्वाड के गुणों का यह सही व्यवहार है। याद रखें कि एक ट्रैक्टर हमेशा दो त्रिकोण के रूप में प्रस्तुत किया जाता है। ऐसा करने की दो संभावनाएं हैं: \ विकर्ण या / विकर्ण उनके सामान्य किनारे के रूप में। विशेषता को कैसे विभाजित किया गया है अब संदिग्ध हो जाता है (दोनों मामलों में अलग है)।

मैं आपको आपके जैसा एक उदाहरण दिखाऊंगा।

enter image description here

त्रिकोण एक \ विकर्ण द्वारा अलग कर रहे हैं।

enter image description here

त्रिकोण एक / विकर्ण द्वारा अलग कर रहे हैं।

दोनों मामलों में, कोने के रंग हैं:

000000 top left 
3B3B3B top right + bottom left 
FFFFFF bottom right 

एक समाधान प्रदान करना है केवल विशेषता मान (रंग) जो स्पष्ट अंतर्वेशित रंग में परिणाम। यह मामला है जब निम्नलिखित है।

ऊपरी बाएं से नीचे दाएं कोने से एक पंक्ति पर विचार करें (चलो इन्हें बेस बेस को एक निर्दिष्ट बेस रंग के साथ कॉल करें)। ऊपरी बाएं कोने में 0 का मान है, नीचे दाएं 1। प्रत्येक अन्य कशेरुक (इस मामले में नीचे बाएं, ऊपरी दाएं) को इस काल्पनिक रेखा के लिए ऑर्थोगोनियल रूप से पेश किया जाना चाहिए और संबंधित मान इस कशेरुक को असाइन किया गया है। इस मामले में (एक वर्ग) दो अन्य कोनों में .5 प्रत्येक का मान होता है। इन कोनों के रंगों को दो आधार रंगों का मिश्रण मान होना चाहिए, जो अल्फा मान के साथ गणना की गई मान के अनुरूप हैं।

enter image description here

आपके मामले में, आप निम्नलिखित रंग का उपयोग करें:

उपरोक्त उदाहरण में, दो अन्य कोनों के रंग आदेश बनाने के लिए दोनों छवियों समान रूप से देखने में 808080 बजाय 3B3B3B होना ही था कोने के लिए (कम से कम, वे इस तरह के रूप में अपने स्क्रीनशॉट में दिखाई देते हैं):

000000 top left 
3A3A3A top right + bottom left 
595959 bottom right 

तो वे ऊपर से आवश्यकता को पूरा नहीं करते हैं, के रूप में 3A3A3A नहीं है अन्य twos के बीच औसत मूल्य।


एक थोड़ा अलग उदाहरण दर्शाता है तुम क्यों हो सकता है नहीं तो बस मिश्रण अल्फा मान (जो दो अन्य कोने के लिए मतलब मूल्यों में परिणाम है) के लिए .5 उपयोग करना चाहते हैं। एक गैर वर्ग ट्रैक्टर पर विचार करें, इस आयत है, जो दो अन्य कोनों के लिए मूल्यों .5 का उपयोग करता है, जो 808080 ग्रे से मेल खाती है जैसे:

enter image description here

आप देख सकते हैं, ढाल की दिशा ओर्थोगोनल नहीं है दो "आधार कोनों" के बीच कनेक्शन लाइन के लिए, जैसा कि मैंने उन्हें बुलाया (शीर्ष बाएं - नीचे दाएं)। अब देखते हैं क्या ऊपर से मेरी विधि का उत्पादन करते हैं:

enter image description here

कौन सा अधिक दो कोनों के बीच एक रैखिक ढाल की तरह लग रहा है, लेकिन में "दुनिया अंतरिक्ष", "बनावट अंतरिक्ष" नहीं में। आप दूसरे पर दो आउटपुट में से एक पसंद कर सकते हैं; मैं आपको अंतर दिखाना चाहता था। कनेक्शन लाइन (orthogonal प्रक्षेपण) पर मान निम्न की तरह लग रहे

enter image description here

मेरा बुरा छवियों ... के लिए खेद है (वे कर रहे हैं केवल अनुमान!);)

+0

पीएस वर्टेक्स निर्देशांक के लिए वही है ... एक ट्रैक्टर (रास्टर टाइल दुनिया में एक फर्श टाइल) पर विचार करें, 1 की ऊंचाई वाले कोनों में से एक, अन्य 0।विकर्ण निर्णय लेता है कि टाइल का केंद्र ऊंचाई पर 0 या 0.5 पर है, बस एक आदर्श बिंदु के रूप में। इनपुट कारण संदिग्ध है, यही कारण है कि हम आम तौर पर quads से बचते हैं। – leemes

+0

उत्तर के लिए धन्यवाद। तो इस मुद्दे को प्रतीत होता है। और अब मैं समझता हूं कि मैं क्या करने की कोशिश कर रहा था असंभव था। चूंकि प्रत्येक त्रिभुज के बारे में जानने का कोई तरीका नहीं है कि प्रतीत होता है कि दूसरी तरफ रंग क्या है। तो प्रश्न के दूसरे भाग के बारे में कैसे मुझे एक अवरोध/धारीदार प्रभाव मिल रहा है। – Andrew

+0

@Andrew बस आपके प्रश्न में एक टिप्पणी जोड़ा। "Dithering" देखो, यह आपको सैद्धांतिक पृष्ठभूमि देना चाहिए। आप फ़्लोटिंग पॉइंट मानों को 0 से 1 तक 255 अलग-अलग चरणों में मैप करना चाहते हैं (जो आपकी स्क्रीन पर छवि का निर्माण करते हैं); हालांकि, आपको उनको एक सीमा पर गोल नहीं करना चाहिए (जो ग्राफिक्स कार्ड आपके लिए डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से करता है) बल्कि पिक्सेल समन्वय के आधार पर थ्रेसहोल्ड मान का निर्णय लेना चाहिए। जटिल लगता है, लेकिन अच्छे परिणाम लाता है। – leemes