GL_TRIANGLES ve düz bir renk, 2d simülasyonu kullanarak, basit bir xy düzleminde düzlük oluşturan bazı basit çokgenler (20'den az köşe noktası) var.Bir parça gölgelendiriciye sahip 2d çokgen üzerinde kenarlık çizme
Bu çokgenlere değişken kalınlıkta bir kenarlık ve farklı bir renk eklemek istiyorum. Çalıştığım aynı köşeleri ve glLineWidth/GL_LINE_LOOP kullanarak uygulanan bir şey var, ama başka bir render geçişi ve tüm verteks dönüşümleri tekrarlar.
Bunu gl_FragCoord ve vertex verileri ve/veya doku koordinatlarını kullanarak parça gölgelendiricisinde yapabilmem gerektiğini düşünüyorum, fakat emin değilim ve benim saf denemelerim açıkça yanlış.
Aşağıdaki gibi bir şey hayal ediyorum.
uniform vec2 scale; // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;
varying vec4 vertex; // in world coords
void main()
{
if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
{
// we're close to the edge the polygon, so we're the border.
gl_FragColor = border_color;
}
else
{
gl_FragColor = fill_color;
}
}
ben anlamaya çalışıyorum parçası distance_from_edge fonksiyonudur - nasıl hesaplanabilir? Gl_FragCoord'un yanlış yaklaşımı kullanıyor mu - bir çeşit doku eşlemesi kullanmalı mıyım?
Bir deneme olarak, köşeyi pixel alanına ölçekle dönüştürmeyi denedim ve ardından pikselle gl_FragCoord arasındaki mesafeyi hesapladım, ancak bu gerçekten anlamadığım garip sonuçlar verdi. Artı vertex değil kenar arasındaki mesafeye ihtiyacım var, ama nasıl elde edeceğimi bilmiyorum.
Herhangi bir fikrin var mı?
DÜZENLEME: kenar köşeler olarak işaretlenmiş 3 köşe renklerde bir üçgen var varsayarsak
ve ortasında bir tepe (yani 3 üçgenler halinde olan render kenardan olarak değil işaretli: Nicol yanıtına dayalı, sorum olur toplam), o zaman belirli bir kalınlık sınırını çizmek için parça gölgelendiricisinde nasıl enterpolasyon yapabilirim? Kenar bayrağını parça gölgelendiriciye ve istenen çizgi kalınlığına geçirdiğimi ve kenar ile kenar köşeleri arasındaki mesafeyi belirlemek için bazı enterpolasyon hesaplamaları yaptığımı ve rengin uygun şekilde kenar/dolgu olarak eşiğini aldığımı farz ediyorum. ?
'gl_FragCoord' kitlesel olacak size yardımcı olmuyor. Bu sadece parçanın ekranda nerede olduğunu söyler; parçanın üçgene göre nerede olduğu hakkında hiçbir şey söylemez. Köşe pozisyonu benzer şekilde kitlesel olarak yararsızdır. Bir köşe noktası olsun ya da olmasın, köşeleri değerlere koyan ve değeri enterpoze eden vertex shader/kullanıcı tarafından sağlanan verilerin yardımına ihtiyacınız olacak. Bu, tek bir üçgenin kenarını algılayamayacağınız anlamına gelir; Üçgeni birkaç üçgen şeklinde bölmeniz gerekir, böylece iç köşeler ve kenar köşeleri ayırt edilebilir. –
Teşekkürler, bir şeyleri kaçırdığımı sanmıştım. Öyleyse, kenar köşesi olarak işaretlenmiş 3 köşeli bir üçgene sahipse ve ortadaki bir tanesi (bu yüzden 4 üçgenle işlenmiş) değilse, o zaman kenarlık için belirli bir çizgi genişliğine nasıl enterpolasyon yaparım? – bloodearnest