স্টেনসিল পরীক্ষার মাধ্যমে এটি কত টুকরো টুকরো টুকরো টুকরো করে তৈরি করা সম্ভব?


11

আমার একটি ওপেনজিএল অ্যাপ্লিকেশন রয়েছে যা অনিয়মিত আকারগুলি (একটি সাধারণ 2-ডি সিএসজির মতো কিছুটা) রেন্ডার করতে স্টেনসিল পরীক্ষাগুলি বেশ বিস্তৃতভাবে ব্যবহার করে । যদি আমি জানতে পারি যে কতগুলি টুকরো টুকরো টুকরো স্টেনসিল পরীক্ষায় উত্তীর্ণ হয়েছে এবং প্রকৃতপক্ষে রেন্ডার করা হয়েছে তবে লাইনের নিচে কিছু গণনা সহজ করার ক্ষেত্রে এটি খুব সহায়ক হবে। বিশেষত, এটি আমাকে পরবর্তীকালে কোনও মন্টি কার্লো সিমুলেশন দিয়ে আনুমানিক না করে বরং বিন্যাসের আকারের ক্ষেত্র নির্ধারণ করতে দেয়।

আমি জানি যে জ্যামিতি শেডার থেকে উদ্ভূত আদিমদের জন্য একই রকম ধারণা রয়েছে, যাকে রূপান্তর প্রতিক্রিয়া বলা হয় । আমি জানতে চাই টুকরা এবং স্টেনসিল পরীক্ষার জন্য কি একই ধরণের ধারণা উপস্থিত রয়েছে concept


একটি অশোধিত সমাধান হ'ল স্টেনসিলের মাধ্যমে কেবল একটি বিপরীতে রঙ করা, সেই বাফারটি সংরক্ষণ করা এবং পরিবর্তিত পিক্সেলের সংখ্যা গণনা করা।
দ্য বজসউ

হুম, স্পেসিফিকেশনটি বলে যে প্রলুব্ধিক প্রশ্নগুলি গভীরতা পরীক্ষায় উত্তীর্ণ টুকরাগুলির সংখ্যা গণনা করে তবে আমার মাথার উপরের অংশে আমি নিশ্চিত নই যে এখনই স্টেনসিল পরীক্ষার সাথে কীভাবে ইন্টারেক্ট হয়।
ক্রিস বলছেন মনিকাকে

@ ক্রিশ্চিয়রান রাউ মনে হচ্ছে যে কেবল গভীরতা পরীক্ষায় উত্তীর্ণ খণ্ডগুলি গণনা করা হবে তবে স্টেনসিল, বাতিল এবং আলফা পরীক্ষা উপেক্ষা করা হবে।
মরিস Laveaux

2
@ ক্রিশ্চিয়ানআর এবং মরিস, মূল এআরবি_কোলেশন_উইকি স্পেস স্পষ্টভাবে বলেছে যে এটি গভীরতা এবং স্টেনসিল উভয় পরীক্ষায় উত্তীর্ণ হওয়া নমুনাগুলিকে গণনা করে । আরও দেখুন এই Stackoverflow প্রশ্ন
নাথান রিড

@ নাথানরিড মনে হচ্ছে আপনি উত্তর লিখতে চলেছেন।
ক্রিস বলছেন মনিকা পুনরায়

উত্তর:


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

আপনি যদি যা আগ্রহী সেই ক্ষেত্রটি, আপনি কোনও পিক্সেল না পৌঁছানো এবং অঞ্চলটিকে তার রঙ থেকে বাদ না দেওয়া পর্যন্ত আপনি স্টেনসিল বাফারকে ছোট করে ফেলতে পারেন।

পদক্ষেপগুলি হবে:

  • পর্যাপ্ত নির্ভুলতার সাথে একটি ফর্ম্যাট ব্যবহার করে স্টেনসিলটি কোনও টেক্সচারে অনুলিপি করুন।
  • একটি শেডার লোড করুন যা প্রদত্ত রঙের সাথে টেক্সেলের সংখ্যার সাথে রঙের সমানুপাতিক আউটপুট দেয়।
  • এক পিক্সেল না হওয়া পর্যন্ত আকার অর্ধেক কমাতে ফ্রেমবফারগুলির মধ্যে পিং-পং করুন।
  • পিক্সেলের রঙটি অঞ্চল দ্বারা coveredাকা ভিউপোর্টের শতাংশ: কেবলমাত্র ভিউপোর্টের ক্ষেত্রফল দিয়ে এটিকে গুণ করুন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.