GlScissor का उद्देश्य क्या है?


32

मुझे पता है कि यह स्टैंसिल परीक्षण की तुलना में अधिक कुशल है, लेकिन क्या मैं सही मान रहा हूं कि व्यूपोर्ट के साथ प्रक्षेपण परिवर्तनों का उपयोग करके समान कार्यक्षमता प्राप्त की जा सकती है?

जवाबों:


46

वे एक-दूसरे के विकल्प की तुलना में अधिक पूरक हैं। आप लगभग हमेशा व्यूपोर्ट के समान कैंची आयत को सेट करना चाहते हैं।

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

यही कारण है कि कैंची में आता है। glScissor () एक स्क्रीन अंतरिक्ष आयत को परिभाषित करता है जिसके आगे कुछ भी नहीं खींचा जाता है (यदि कैंची परीक्षण सक्षम है)।

उदाहरण के लिए, निम्न कोड पूरी स्क्रीन को साफ कर देगा, भले ही व्यूपोर्ट बड़ी खिड़की के एक छोटे हिस्से पर सेट हो: आदि

glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);

GlScissor () जोड़ना और कैंची परीक्षण को सक्षम करना (जो डिफ़ॉल्ट रूप से अक्षम है) स्पष्ट को प्रतिबंधित करता है।

glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

कभी-कभी आप एक कार्यान्वयन में आते हैं जो स्वचालित रूप से व्यूपोर्ट क्षेत्र में कैंची करता है, लेकिन यह जीएल विनिर्देश का उल्लंघन करता है।

इसके अलावा, कैंची के आयत का उपयोग अस्थायी रूप से व्यूपोर्ट के उप-आयत में विशेष प्रभाव, यूआई तत्वों, आदि के लिए ड्राइंग को प्रतिबंधित करने के लिए किया जा सकता है।


11
अधिक स्पष्ट होने के लिए, Viewportशीर्ष गणना की क्लिपिंग करें। यदि आप लाइन मोटाई के साथ एक रेखा खींचते हैं> 1 या बिंदु gl_PointSize1> के साथ आप व्यूपोर्ट के बाहर भी आकर्षित करेंगे।
17

13

वे ग्राफिक्स पाइपलाइन के दो पूरी तरह से अलग हिस्सों में काम करते हैं।

glViewport वास्तव में एक परिवर्तन को निर्दिष्ट करता है, और यह एक परिवर्तन है जो शीर्ष shader के बाद होता है लेकिन खंड shader से पहले। यदि यह देखने में मदद करता है कि यह वैचारिक रूप से कहां फिट बैठता है, तो इसके बारे में सोचें कि यह उन परिवर्तनों का हिस्सा है जो आपके वर्टेक्स डेटा को विश्व अंतरिक्ष से स्क्रीन स्पेस में प्राप्त करने के लिए उपयोग किए जाते हैं (अर्थात यह मॉडलव्यू और प्रोजेक्शन से अपेक्षाकृत निकटता से संबंधित है)।

स्कैस्टर परीक्षण तब होता है, जब टुकड़े टुकड़े करने वाले व्यक्ति के साथ, उस समय होने वाले अन्य प्रति-टुकड़े संचालन, जैसे कि सम्मिश्रण, गहराई / स्टैंसिल इत्यादि सभी के साथ, जब कैंची परीक्षण द्वारा टुकड़े का परीक्षण किया जाता है, तो यह पहले से ही हो चुका होता है। व्यूपोर्ट परिवर्तन।

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

तो उस सब को एक साथ रखकर आप देख सकते हैं कि कैंची परीक्षण क्यों मौजूद है। यह आपको स्क्रीन के आयताकार हिस्से में प्रति-खंड ऑप्स को बाध्य करने की क्षमता देता है, लेकिन वास्तव में वर्तमान व्यूपोर्ट परिवर्तन को संशोधित किए बिना।


6

मुझे इस तरह की बातें अच्छी लगती हैं।

OnpenGL में हमारे पास 2 डी निर्देशांक हैं जो X और Y अक्ष दोनों के लिए -1 से +1 तक जाते हैं।

यहाँ छवि विवरण दर्ज करें

फिर इस छवि को विंडो निर्देशांक में मैप करने की आवश्यकता है।

आइए कल्पना करें कि हमारे पास खिड़की है जिसमें पीछे की जमीन के रूप में एक गहरा रंग है, और हमारे पास स्पष्ट रंग के रूप में सफेद है।

सबसे आम मामला व्यूपोर्ट और कैंची के पूरे स्क्रीन को कवर करने का है।

यहाँ छवि विवरण दर्ज करें

लेकिन हम उन्हें स्क्रीन का एक छोटा क्षेत्र बनाने के लिए सेट कर सकते हैं।

यहाँ छवि विवरण दर्ज करें

ये क्षेत्र अलग-अलग हो सकते हैं। निम्नलिखित उदाहरण में व्यूपोर्ट पूरी स्क्रीन को कवर करता है, जबकि कैंची छोटा बॉक्स है।

यहाँ छवि विवरण दर्ज करें

और इस आखिरी मामले में कैंची पूरी स्क्रीन को कवर करती है, जबकि व्यूपोर्ट छोटा बॉक्स है। सूचना जो glClearपूरे स्क्रीन को प्रभावित करती है, क्योंकि यह कैंची क्षेत्र द्वारा निर्धारित की जाती है।

यहाँ छवि विवरण दर्ज करें


1
यह मेरे लिए सबसे स्पष्ट स्पष्टीकरण है, इसे वास्तव में चित्र बनाने की आवश्यकता थी।
लॉरेंट कैलेट

5

glScreens स्क्रीन के एक हिस्से के खिलाफ ज्यामिति की कतरन को पूरा करता है।

आप यह चाहते हैं, उदाहरण के लिए, यदि आप एक GUI बॉक्स प्रदान कर रहे थे जिसमें पाठ को आसानी से स्क्रॉल किया गया था। आप जीयूआई द्वारा कवर की गई स्क्रीन के हिस्से के बाहर सभी ज्यामिति को क्लिप करना चाहते हैं, लेकिन आंशिक पाठ या बहुभुज रखें जो अभी भी अंदर हैं।

glViewport प्रोजेक्शन निर्देशांक को डिवाइस के निर्देशांक में मैप करता है, लेकिन क्लिप नहीं करता है।

ग्लिसलोन का उपयोग अनियमित आकार जैसे अधिक जटिल पैटर्न में व्यक्तिगत पिक्सेल को मुखौटा बनाने के लिए किया जाता है। इस प्रकार, ग्लसेसर्स तेज है।


1

glScissor व्यूपोर्ट के साथ प्रक्षेपण परिवर्तनों की तुलना में अधिक सरल है।

glScissor परीक्षण निर्दिष्ट करता है कि प्रतिपादन करते समय कौन से पिक्सेल को बदला जाए, जबकि glViewport बदलता है कि डिवाइस के निर्देशांक से विंडो निर्देशांक में gl को कैसे मैप करना चाहिए।

फिर व्यूपोर्ट को उस आयत में सेट करने में क्या अंतर है जिसे आप व्यूपोर्ट द्वारा किए गए स्केलिंग को पूर्ववत करने के लिए प्रोजेक्शन मैट्रिक्स को प्रस्तुत करना और समायोजित करना चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.