Şablon testi ile kaç parçanın yapıldığını bulmak mümkün müdür?


11

Şablon testlerini düzensiz şekiller (biraz 2-B CSG gibi ) işlemek için oldukça yaygın olarak kullanan bir OpenGL uygulaması var . Şablon testinden kaç parçanın geçtiğini ve gerçekten oluşturulduğunu öğrenebilseydim, bu, bazı hesaplamaları basitleştirmede çok yardımcı olacaktır. Özellikle, daha sonra bir Monte Carlo simülasyonu ile yaklaşmak yerine, işlenen şeklin alanını ücretsiz olarak belirlememe izin verir.

Geometri gölgelendiricisinden yayılan, dönüşüm geribildirimi adı verilen ilkeller için benzer bir kavram olduğunu biliyorum . Parçalar ve şablon testi için benzer bir kavramın var olup olmadığını bilmek istiyorum.


Ham bir çözüm, şablondan bir kontrast rengi diğerine boyamak, bu arabelleği kurtarmak ve değiştirilen piksel sayısını saymak olacaktır.
TheBuzzSaw

Hmm, belirtim, oklüzyon sorgularının derinlik testini geçen parça sayısını saydığını , ancak başımın üstünden bunun şablon testiyle nasıl etkileşime girdiğinden emin değilim.
Chris, Reinstate Monica'ya

@ChristianRau Sadece derinlik testlerini geçen fragmanlar sayılacak gibi görünüyor, ancak şablon, atma ve alfa testleri göz ardı ediliyor.
Maurice Laveaux

2
@ChristianRau ve Maurice, orijinal ARB_occlusion_query Spec açıkça bu numuneler hem derinlik geçen sayar diyor ve olsa şablon testleri. Ayrıca bu StackOverflow sorusuna da bakın .
Nathan Reed

@NathanReed Bir cevap yazmak üzereymişsiniz gibi geliyor.
Chris, Reinstate Monica'ya

Yanıtlar:


10

Olası bir yaklaşım, Donanım Oklüzyon Sorgusu'nun kullanılması olabilir.

Spesifikasyona göre, Şablon Testinin derinlik testinden önce yürütüldüğü ve yalnızca derinlik testini geçen parçaların Oklüzyon Sorgusu tarafından sayıldığı gerçeklerini kullanabilirsiniz.

Basit bir örnek (test edilmedi) şöyle olacaktır:

    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);

Örnek sayısını alma çağrısının zorla boru hattının sifonunu çağıracağını ve sorgunun bitmesini bekleyeceğini unutmayın. Daha eşzamansız bir yaklaşıma ihtiyacınız varsa, oklüzyon sorgusunun yapılıp yapılmadığını aşağıdakileri kullanarak sorgulayabilirsiniz:

    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

İlgilendiğiniz alan ise, bir piksele ulaşana ve bu alanı renginden çıkaracak şekilde şablon arabelleğini küçültebilirsiniz.

Adımlar şöyle olacaktır:

  • Şablonu, yeterli hassasiyette bir format kullanarak bir dokuya kopyalayın.
  • Belirli bir renge sahip metin sayısıyla orantılı bir renk veren bir gölgelendirici yükleyin.
  • Bir piksele ulaşana kadar boyutu yarıya indirmek için çerçeve tamponları arasında ping pong yapın.
  • Pikselin rengi alanın kapsadığı görünüm alanının yüzdesidir: sadece görünüm alanının alanı ile çarpın.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.