2012-03-19 17 views
22

, sonra bu yapın:Piksel bilgilerini bir parça gölgelendiricide nasıl edinilir? benim parça gölgelendirici ben bir doku yükleyebilir yılında

doku renk değerine geçerli piksel ayarlar
uniform sampler2D tex; 

void main(void) { 
    vec4 color = texture2D(tex, gl_TexCoord[0].st); 
    gl_FragColor = color; 
} 

. Bunları değiştirebilirim ve iyi çalışır.

Ancak birkaç soru. "Hangi" piksel olduğumu nasıl anlarım? Örneğin, 100.100 (x, y) pikselini kırmızıya ayarlamak istiyorum. Siyah olan her şey. Nasıl yapabilirim:

"eğer currentSelf.Position() == (100,100); daha sonra color = kırmızı; else color = black?"

?

Renklerin nasıl ayarlanacağını biliyorum, ancak "konumumu" nasıl alabilirim?

İkinci olarak, bir komşu pikselden nasıl değerler alabilirim? berrak

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st); 

Ama bu ne döndürüyor:

Bu çalıştı? eğer ben 100.100 pikselim; değerleri 101,100 veya 100,101'den nasıl alabilirim?

cevap

28

"Hangi" piksel olduğumu nasıl anlarım?

Siz bir piksel değilsiniz. Bir parçası. OpenGL'nin onları "Fragmanlar" olarak adlandırması için bir sebep var; Bunun nedeni, pikselleri ve pikselleri değildir. Gerçekten de, onlar asla piksel haline gelmeyebilir (discard veya derinlik testleri ile ya da her ne olursa olsun), çoklu örnekleme sayesinde, çoklu fragmanlar bir tek piksel oluşturmak için birleştirilebilir.

Parça gölgelendiricinizin pencere alanında nerede olduğunu söylemek isterseniz, gl_FragCoord'u kullanın. Fragman konumları, tam sayı değil, kayan nokta değerleridir, bu nedenle tek bir "100, 100" değeri yerine bir aralık ile test etmeniz gerekir.

İkinci olarak, bir komşu pikselden nasıl değerler alabilirim?

komşu karetamponu piksel söz ediyorsanız, değil yapmak . Fragman gölgelendiriciler, çerçeveleyiciden kendi konumlarında veya komşu birinde rasgele okunamazlar.

Eğer erişilen birinden komşu Texel erişme hakkında konuşuyorsak, o doku sen texture2D geçmek koordinat ağırlık verme meselesi bu. Doku boyutunu elde etmelisiniz (GLSL 1.30 veya üstü kullanmıyorsunuz, bunu manuel olarak geçirmeniz gerekiyor), boyutu tersine çevirin ve bu boyutları doku koordinatının S ve T bileşeninden ekleyin veya çıkartın. .

+1

Beni ona yendi iyi bir örnek var; Ben bu biraz daha farklı olduğunu söylemek zorundayım "gl_FragCoord" biraz daha fazla ayrıntıya gider http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_FragCoord.xml bağlantı ve bir öneri Eğer çıktı tamponlarını birden fazla komşu pikselin kombinasyonuna bağlı olarak gerçekten çıktı tamponu olarak hesaplamak istiyorsa ara dokuya dönüşür. – Tommy

+0

Temel olarak, yapmak istediğim şey, x, y piksellerinin x, y ile kırmızısını artıran piksel x, y ile komşudur. Bunu nasıl yapacağını açıklayan bir öğretici var mı? – user697111

+2

@ user697111: Bir dokunun kırmızı kanalında çalışan bir "genişleme" filtresi uygulamak istiyorsunuz. Google bu anahtar kelimeler ve bol miktarda bulmalısınız. – datenwolf

0

Kolay peasy.

Sadece çözünürlüğe dayalı bir piksel boyutunu hesaplamanız yeterlidir. Sonra +1 ve -1'ye bak.

vec2 onePixel = vec2(1.0, 1.0)/u_textureSize; 
gl_FragColor = (
    texture2D(u_image, v_texCoord) + 
    texture2D(u_image, v_texCoord + vec2(onePixel.x, 0.0)) + 
    texture2D(u_image, v_texCoord + vec2(-onePixel.x, 0.0)))/3.0; 

here

İlgili konular