मैं किसी विशेष पिक्सेल को न लिखने के लिए एक टुकड़ा shader कैसे बता सकता हूं?


11

एक WebGL में मैं एक स्क्रीन स्पेस क्वैड भेजना चाहूंगा जिसके माध्यम से एक टुकड़ा shader द्वारा संसाधित किया जाता है, लेकिन टुकड़ा shader केवल कुछ शर्तों के तहत एक पिक्सेल लिखता है (कहते हैं ... कि यह एक सर्कल के भीतर था, या यह कि पिक्सेल कर्व समीकरण या किसी चीज द्वारा परिभाषित आधे क्षेत्र के सकारात्मक पक्ष से संबंधित था)।

क्या यह कहना संभव है कि "एक पिक्सेल न लिखें"?

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

वहाँ एक रास्ता है, हालांकि टुकड़ा shader बनाने के लिए एक पिक्सेल बिल्कुल नहीं लिखने का चयन करें?

जवाबों:


10

हाँ, आप discardपिक्सेल लिखने से बचने के लिए टुकड़े टुकड़े कर सकते हैं । यहां एक यादृच्छिक उदाहरण है जो मैंने Google से खोदा था।

ध्यान दें कि यह वास्तव में प्रसंस्करण से खंड shader को रोक नहीं सकता है (जैसा कि GPU ब्लॉकों में टुकड़ों को संसाधित करने के लिए जाता है, केवल एक खंड में सभी टुकड़ों से हटना प्रसंस्करण को छोड़ देगा)। लेकिन टुकड़ा आउटपुट को नहीं लिखा जाएगा, जो मूल रूप से आप चाहते हैं।

आप इस से संबंधित प्रश्नdiscard और SO पर इस एक के प्रदर्शन के बारे में रुचि ले सकते हैं ।

मुझे कोई अंदाजा नहीं है अगर यह वेबजीएल में समर्थित है। यदि ऐसा नहीं है, तो आपको अपने एक सुझाव पर वापस आना होगा (जैसे अल्फा सम्मिश्रण; मुझे लगता है कि यह सबसे सरल होगा)।


3

discardबयान काम में आता।

आपने अपने निर्णय पथ के बारे में बहुत अधिक नहीं कहा, इसलिए मैं एक साधारण बनावट देखने के लिए एक उदाहरण प्रस्तुत करूंगा:

void main() {
    gl_FragColor = texture2D(u_texture, v_uv) * u_color;
    if (gl_FragColor.a <= 0.0) discard;
}

(यह कुछ नमूना कोड से है जो मैंने अल्फ़ा सम्मिश्रण के बारे में जानने से पहले लिखा था।)

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