क्या यह पता लगाना संभव है कि स्टैंसिल परीक्षण के माध्यम से कितने टुकड़े किए गए?


11

मेरे पास एक OpenGL एप्लिकेशन है जो अनियमित आकृतियों (एक साधारण 2-डी सीएसजी की तरह थोड़ा) को रेंडर करने के लिए स्टैंसिल परीक्षणों का काफी उपयोग करता है । अगर मुझे पता चल सके कि स्टैंसिल परीक्षण में कितने टुकड़े पास हुए और वास्तव में रेंडर किए गए, तो यह रेखा के नीचे कुछ गणनाओं को सरल बनाने में बहुत मददगार होगा। विशेष रूप से, यह मुझे एक मोंटे कार्लो सिमुलेशन के साथ बाद में अनुमानित करने के बजाय मुक्त करने के लिए प्रदान की गई आकृति के क्षेत्र को निर्धारित करने की अनुमति देगा।

मुझे पता है कि ज्यामिति shader से उत्सर्जित आदिम के लिए एक समान अवधारणा है, जिसे रूपांतरण प्रतिक्रिया कहा जाता है । मैं जानना चाहूंगा कि क्या खंडन और स्टैंसिल परीक्षण के लिए समान अवधारणा मौजूद है।


एक क्रूड सॉल्यूशन केवल स्टैंसिल के माध्यम से एक दूसरे के विपरीत रंग को रंगना होगा, उस बफर को बचाएं, और उन पिक्सेल की संख्या की गणना करें जिन्हें बदल दिया गया था।
बज़स्सॉ

हम्म, विनिर्देश का कहना है कि ओब्सीडेशन क्वेश्चंस गहराई परीक्षण को पास करने वाले अंशों की संख्या की गणना करता है , लेकिन मेरे सिर के ऊपर से मुझे यकीन नहीं है कि यह अभी स्टैंसिल परीक्षण के साथ कैसे इंटरैक्ट करता है।
क्रिस का कहना है कि मोनिका

@ChristianRau ऐसा लगता है कि गहराई परीक्षणों को पारित करने वाले केवल टुकड़ों को गिना जाएगा, लेकिन स्टैंसिल, त्याग और अल्फा परीक्षणों को अनदेखा किया जाता है।
मौरिस लावॉक्स 22

2
@ChristianRau और मौरिस, मूल ARB_occlusion_query कल्पना स्पष्ट रूप से कहती है कि यह दोनों गहराई और स्टैंसिल परीक्षणों से गुजरने वाले नमूनों की गिनती करता है । इस StackOverflow प्रश्न को भी देखें ।
नाथन रीड

@NathanReed लगता है जैसे आप एक उत्तर लिखने वाले हैं।
क्रिस का कहना है कि

जवाबों:


10

एक संभावित दृष्टिकोण हार्डवेयर ऑक्यूपेशन क्वेरी का उपयोग हो सकता है।

आप उन तथ्यों का उपयोग कर सकते हैं जो विनिर्देशन द्वारा, स्टैंसिल टेस्ट को गहराई परीक्षण से पहले निष्पादित किया जाता है, और केवल गहराई परीक्षण पास करने वाले टुकड़ों को अपवाद क्वेरी द्वारा गिना जाता है।

एक सरल उदाहरण (परीक्षण नहीं किया गया) होगा:

    GLuint samples_query = 0;
    GLuint samples_passed = 0;
    glGenQueries(1, &samples_query);
    // Initialize your buffers and textures ...
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_STENCIL_TEST);

    // Set up the values on the stencil buffer ...

    // Now we count the fragments that pass the stencil test
    glDepthFunc(GL_ALWAYS); // Set up the depth test to always pass
    glBeginQuery(GL_SAMPLES_PASSED, samples_query);
    // Render your meshes here
    glEndQuery(GL_SAMPLES_PASSED);
    glGetQueryObjectuiv(samples_query, GL_QUERY_RESULT, &samples_passed);
    // samples_passed holds the number of fragments that passed the stencil test (if any)

    // Release your resources ...
    glDeleteQueries(1, &samples_query);

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

    GLuint query_done = 0;
    glGetQueryObjectuiv(samples_query, GL_QUERY_RESULT_AVAILABLE, &query_done);
    if (query_done != 0)
        // Your query result is ready
    else
        // Maybe check the next frame?

2

यदि आप जिस क्षेत्र में रुचि रखते हैं, वह क्षेत्र है, आप स्टैंसिल बफर को तब तक कम कर सकते हैं जब तक आप एक पिक्सेल तक नहीं पहुंचते और उस क्षेत्र को उसके रंग से नहीं हटा सकते।

चरण होंगे:

  • पर्याप्त सटीकता के साथ एक प्रारूप का उपयोग करके स्टेंसिल को एक बनावट में कॉपी करें।
  • एक शेडर लोड करें जो किसी दिए गए रंग के साथ टेक्सल्स की संख्या के लिए आनुपातिक रूप से आउटपुट करता है।
  • पिंग-पोंग को फ्रेमबफ़र्स के बीच एक पिक्सेल तक पहुंचने तक आधे से आकार कम करने के लिए।
  • पिक्सेल का रंग क्षेत्र द्वारा कवर किए गए व्यूपोर्ट का प्रतिशत है: बस व्यूपोर्ट के क्षेत्र से इसे गुणा करें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.