GlScissor'ın amacı nedir?


32

Bunun şablon testinden daha verimli olduğunu biliyorum, ancak aynı işlevselliğin görünüm penceresi olan projeksiyon dönüşümleri kullanılarak elde edilebileceğini varsayıyor muyum?

Yanıtlar:


46

Birbirlerine alternatiflerinden daha tamamlayıcılar. Makas dikdörtgenini neredeyse her zaman görünüm alanı ile aynı değerlere ayarlamak istersiniz.

glViewport () normalize projeksiyon alanından ekran alanına dönüşümü belirtir. Çokgenler yansıtma alanının kenarına kırpılır, ancak glClear () gibi diğer çizim işlemleri değildir. Bu nedenle, ekran alanı görüntü alanı bölgesinin konumunu ve boyutunu belirlemek için glViewport () öğesini kullanırsınız, ancak görüntüleyici yine de o bölgenin dışındaki pikselleri oluşturabilir.

Makasın girdiği yer. GlScissor (), ötesinde hiçbir şeyin çizilmediği bir ekran alanı dikdörtgeni tanımlar (makas testi etkinse).

Bu nedenle, örneğin, vitrin daha büyük pencerenin küçük bir bölümüne ayarlanmış olsa bile, aşağıdaki kod tüm ekranı temizleyecektir:

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

GlScissor () eklenmesi ve makas testinin etkinleştirilmesi (varsayılan olarak devre dışıdır) netliği sınırlar.

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

Zaman zaman otomatik olarak görünüm alanına otomatik olarak makaslayan ancak GL spesifikasyonlarını ihlal eden bir uygulamaya rastlarsınız.

Bunun ötesinde, makas dikdörtgen, özel efektler, kullanıcı arabirimi öğeleri vb. İçin çizimi geçici olarak görünümün alt dikdörtgenine sınırlamak için kullanılabilir.


11
Daha açık olmak Viewportgerekirse, köşe hesaplamaları klipler. Çizgi kalınlığı> 1 olan bir çizgi veya> 1 olan bir nokta gl_PointSizeçizerseniz, görünümün dışına da çizersiniz.
gman

13

Grafik boru hattının tamamen farklı iki parçasında çalışırlar.

glViewport aslında bir dönüşümü belirtir ve bu, tepe gölgelendiriciden sonra ancak parça gölgelendiriciden önce gerçekleşen bir dönüşümdür. Kavramsal olarak nereye oturduğunu görmeye yardım ederse, vertex verilerinizi dünya uzayından ekran alanına almak için kullanılan dönüşümlerin bir parçası olduğunu düşünün (yani modelleme ve projeksiyon ile nispeten yakından ilgilidir).

Makas testi, karıştırıcı, derinlik / şablon vb. Gibi o sırada gerçekleşen tüm diğer parça başına işlemlerle birlikte, parça gölgelendiriciden sonra gerçekleşir. Bir parça makas testi tarafından test edildiğinde, bakış açısı dönüşümü.

Evet, makas testi daha hızlı olabilir, çünkü şablonun ekran uzay kodlayıcılarını temel alan basit bir kabul / reddetmedir, oysa şablonun şablon tamponundaki mevcut değerle karşılaştırılması gerekir, muhtemelen mevcut değerin artırılması veya azaltılması gerekir. derinlik testi sonuçları vb.

Bunları bir araya getirerek, makas testinin neden var olduğunu görebilirsiniz. Parça başına op'ları ekranın dikdörtgen kısmına sınırlama yeteneği sağlar, ancak geçerli görünüm portu dönüştürmesini değiştirmeden.


6

Görsel olarak anlatılan bu tür şeyleri severim.

OnpenGL'de hem X hem de Y ekseni için -1'den +1'e giden 2D koordinatlarımız var.

görüntü tanımını buraya girin

O zaman bu görüntünün pencere koordinatlarına eşlenmesi gerekiyor.

Diyelim ki arka plan olarak koyu renkli bir penceremiz ve açık renk olarak beyazımız var.

En sık karşılaşılan durum görüntü ekranı ve makasın tüm ekranı kaplamasıdır.

görüntü tanımını buraya girin

Ancak onları ekranın daha küçük bir bölgesi olarak ayarlayabiliriz.

görüntü tanımını buraya girin

Bu bölgeler farklı olabilir. Aşağıdaki örnekte, görünüm penceresi tüm ekranı kaplarken, makas daha küçük kutu şeklindedir.

görüntü tanımını buraya girin

Ve bu son durumda makas tüm ekranı kaplarken, görünüm alanı daha küçük kutu. glClearMakas bölgesi tarafından belirlendiğinden beri tüm ekranı etkileyen dikkat edin .

görüntü tanımını buraya girin


1
Bu benim için en net açıklama, gerçekten çizime ihtiyacı var.
Laurent Caillette

5

glScissors ekranın bir kısmına karşı geometrinin kırpılmasını sağlar.

Örneğin bunu, içinde yumuşak bir şekilde kayan bir metin olan bir GUI kutusu oluşturuyor olsaydı isterdiniz. Tüm geometriyi GUI tarafından kapsanan ekran bölümünün dışına kırpmak istiyorsunuz, ancak hala içinde olan kısmi metni veya çokgenleri saklamak istiyorsunuz.

glViewport, projeksiyon koordinatlarını cihaz koordinatlarıyla eşleştirir ancak klipslemez.

glStencil, düzensiz şekiller gibi daha karmaşık desenlerde tek tek pikselleri maskelemek için kullanılır. Böylece, glScissors daha hızlıdır.


1

glScissor, görüntüleme çerçeveli projeksiyon dönüşümlerinden daha basittir.

glScissor testi, oluşturma sırasında hangi piksellerin değiştirileceğini belirtirken, glViewport, gl'in cihaz koordinatlarından pencere koordinatlarına nasıl eşleneceğini değiştirir.

Öyleyse, görüntüleme çerçevesini, yapmak istediğiniz dikdörtgene ayarlamak ve görüntüleme çerçevesi tarafından yapılan ölçeklendirmeyi geri almak için yansıtma matrisini ayarlamakla ilgili fark nedir.

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.