2012-01-25 24 views
6

OpenGL 2.0 kullanarak bir 2D iOS oyunu üzerinde çalışıyorum ve görüntüleri bir parıltı ile çizecek bir gölgelendirici yazmanın mümkün olup olmadığını merak ediyorum. Tüm görüntüler 2D sprite. Anahat için gördüğüm gölgelendirici örnekleri 3B nesneler içindir, bu yüzden 2D görüntüler için mümkün olup olmadığından emin değilim.OpenGL ES Gölgelendirmek için 2D resimler

+0

Yani eklemek istediğiniz ışıma bir gölge gibi mi? –

+0

Görüntünün etrafında yumuşak kenarları olacak bir vuruş daha. –

cevap

7

the Wikipedia article'da gösterildiği gibi bir görüntü oluşturan bir kenar algılama filtresi (Sobel gibi) kabul edersiniz ve bunu kenarların yumuşatılması ve daha fazla parlaklık vermesi için sonuçlarda bir Gauss bulanıklığı izler misiniz? bu görüntü sahnesine mi?

Pratikte, gördüğünüz 3 boyutlu anahatlı gölgelendiricileri yeniden kullanabilirsiniz - teoride derinlik miktarlarını (ES'de uzun süreli bir çaba ile) incelemenize rağmen, gördüğüm her şey sadece 2d etkisi oldu işlenen görüntü.

DÜZENLEME: Daha fazla düşünmek gerekirse, Laplacian'ın basit bir konvolüsyon shader olarak (like this yerlerinde açıklandığı gibi) yapılabilmesi için Sobel'den biraz daha kolay uygulanabilir. Mobil cihazlarda güvenli olmasına rağmen, muhtemelen en fazla 3x3 kernele yapışmak ve verilerle yapmak yerine her etki için farklı bir gölgelendirici yazmak isteyebilirsiniz. Yani örn. uzun uzadıya dışarı yazılmış bir kaba Gauss bulanıklığı,:

void main() 
{ 
    mediump vec4 total = vec4(0.0); 
    mediump vec4 grabPixel; 

    total +=  texture2D(tex2D, texCoordVarying + vec2(-1.0/width, -1.0/height)); 
    total +=  texture2D(tex2D, texCoordVarying + vec2(1.0/width, -1.0/height)); 
    total +=  texture2D(tex2D, texCoordVarying + vec2(1.0/width, 1.0/height)); 
    total +=  texture2D(tex2D, texCoordVarying + vec2(-1.0/width, 1.0/height)); 

    grabPixel =  texture2D(tex2D, texCoordVarying + vec2(0.0, -1.0/height)); 
    total += grabPixel * 2.0; 

    grabPixel =  texture2D(tex2D, texCoordVarying + vec2(0.0, 1.0/height)); 
    total += grabPixel * 2.0; 

    grabPixel =  texture2D(tex2D, texCoordVarying + vec2(-1.0/width, 0.0)); 
    total += grabPixel * 2.0; 

    grabPixel =  texture2D(tex2D, texCoordVarying + vec2(1.0/width, 0.0)); 
    total += grabPixel * 2.0; 

    grabPixel = texture2D(tex2D, texCoordVarying); 
    total += grabPixel * 4.0; 

    total *= 1.0/16.0; 

    gl_FragColor = total; 
} 

Ve Laplace kenar algılamak benzer ancak farklı sabitleri görünümlü biter.

Bir en iyileştirme olarak, bağıl doku okumalarından kaçınacağından, parça gölgelendiricisinden ziyade, göreli örnekleme noktalarınızı parça gölgelendiricisinde değil, farklılıkların sınırlarını dikkate alarak yerine getirmeniz gerekir.

+0

Belki de doğru 3D olanlara bakmıyorum, ama gördüğüm ışık kaynağı üzerinde bir dereceye kadar iş görüyormuş gibi görünüyor, ki bu bana 2B vermedim. Gölgelendiricilerde çok yeniyim, bu yüzden muhtemelen burada bariz bir şekilde görüyorum. –

+0

Jet Sonrası Ayarlı Radyo hücresi gölgelendiricilerinin çoğu, ileriye dönük bir kenar ile arkaya dönük bir kenar arasındaki birleştirme kenarı tanımlayarak kenarları algılamak için kamera konumunu kullanır. Belli ki bunlardan birini kullanamazsınız. Ancak, Sobel ve Laplacian gibi yaklaşımlar, 2d görüntüsündeki renkteki süreksizlikleri, kenarları tespit etmek için arar, bu yüzden tamamen uygundur. Evrişim filtrelerini okumak akıllıca olabilir, henüz yapmadıysanız, Laplacian ve Gaussian bulanıklığını araştırın. İkincisi için acele toplanmış örnek kod ekledim. – Tommy