2015-03-17 25 views
11

Kare doku tekstürünü, dokuyu zamanın ortasına taşımaya çalışıyorum. Aşağıdaki kod, geometrinin merkezine (düzlem) ulaştığında çekilen pikselin kaybolmasını istemediğimde ve zamana göre yalnızca daha küçük bir hal alırken ve zamanın daralması gibi göründüğü sürece bu işi yapıyor.Tekstili merkeze taşımak için gölgelendiriciyi kullanma

enter image description here

uniform float time; 
varying vec2 vUv; 

void main() { 

    vec2 center = vec2(0.5, 0.5); 
    vec2 newPosition = vec2(vUv.x + t * (center.x - vUv.x), vUv.y + t * (center.y - vUv.y); 

    gl_FragColor = texture2D(texture, vec2(newPosition.x, newPosition.y)); 
} 

Düzenleme: doku merkezindeki kara delik olarak bu

düşünün. enter image description here

+0

t 0,0 ile 1,0 arasında mı? – Robinson

+0

t işleme döngüsünde her zaman artar: (yani, t + = 0,01) – socrateisabot

+0

Ardından, "vUv.x" ve "t * (center.x - vUv.x)" arasındaki eşitsizlik büyümeye devam edecektir. 'T = 0.0' 'da' (vUv.x, vUv.y) 've' t = 1.0' 'dır (' center.x, center.y) '. Burada sahip olduğunuz şey 't * merkez - (1.0 - t) * vUv' - merkezin solundaki pikseller için' 1.0' sonra bu değer pozitiftir ve merkezin sağında negatiftir. dokunuzu hareket ettirmekten ziyade, onu ölçeklendirirsiniz (ve aslında, çevirir). Bunun yerine vec2 (vUv.x + t * center.x, vUv.y + t * center.y) 'yi kullanmayı denediniz mi? –

cevap

1

Anladığım kadarıyla , sen texel bir süre sonra vUvt=0 de ve center olmak istiyorum.

Sonuç, dokunun ortasındaki yakınlaştırmadır.

Aslında kodunuzu t = 0'dan t = 1'a yapın. t = 1, metin konumu center şeklindedir.

mix işlevini kullanarak aynı davranışı görüyorsunuz.

vec2 newPosition = mix(vUv, center, t); 

Ayrıca t = 1tüm texel center konusu olduğunda ve görüntü tek bir renk resimdir. (Doku ortasının rengi).

Sorununuz, t'un büyümeye devam etmesidir. Ve t > 1 olduğunda, metin yolunda devam eder. Hepsi merkezde buluştuktan sonra, şimdi birbirlerinden ayrılıyorlar. Efekt, dokunun tersine döndüğü ve bir yakınlaştırma gördüğünüzdür.

bunu birden çözümler vardır bitmesini istediğiniz yönteme bağlı:

Sen maksimal zoom gidin ve bu görüntüyü tutmak istiyorum
  • : clampt aralığında [0, 1] bu t = clamp(t, 0, 1); gibi.

  • En yüksek yakınlaştırmaya gitmek ve görüntü yoksaymak istiyor: t > 1 (veya tek renkli görüntüyü istemiyorsanız t >= 1) için çizmek için durun.

  • Sonsuz bir yakınlaştırma, yani tekstiğine yakın ve merkeze yaklaşıyorsunuz ama asla ulaşmıyorsunuz.

bu üçüncü bir davranış için, yeni bir t kullanabilirsiniz t2 ki:

  • t2 = 1 - 1/(t*k+1); // Where k > 0
  • t2 = 1 - pow(k, -t); // Where k > 1
  • t2 = f(t); // Where f(0) = 0, f is increasing, continuous and limit in +∞ is 1
1

Son zamanlarda, yüzleştim aynı sorun. Ama internette, dokuların dokularını merkeze taşımak yerine tünel gölgelendiricisi olan alternatif bir çözüm buldum. İstediğiniz gibi benzer davranışı var.

float time = -u_time * 0.15; 
vec2 p = 2.0 * gl_FragCoord.xy/u_res.xy -1.0; 
vec2 uv; 

float a = atan(p.y,p.x); 
float r = sqrt(dot(p,p)); 
uv.x = time+.1/r; 
uv.y = a/3.1416; 

vec4 bg = texture2D(u_texture, uv); 

Umarım yardımcı olur.

+0

Evet, bunu buldu, teşekkürler :) – socrateisabot

+0

@socrateisabot, eğer yararlı olduğunu düşünüyorsanız, cevap olarak kontrol etmelisin! – Nolesh