2017-04-18 7 views
3

Les références indiquent "Renvoie la moyenne pondérée des quatre éléments de texture les plus proches des coordonnées de texture spécifiées". Comment sont-ils pondérés? Et qu'en est-il des textures 3D, n'utilise-t-il encore que 4 texels pour l'interpolation ou plus?Quel algorithme utilise GL_LINEAR exactement?

+3

En tant qu'observateur extérieur, je spéculerais que c'est juste l'interpolation linéaire 2D. –

+0

@OliverCharlesworth Il est bilinéaire ... – Spektre

Répondre

1

dans textures 2D y a 4 échantillons utilisés qui signifie interpolation bi-linéaire de sorte 3x interpolation linéaire. Le poids est la distance normalisée du texel cible à ses 4 voisins.

Ainsi, par exemple, vous voulez que le texel à

(s,t)=(0.21,0.32) 

mais la texture à proximité texels a des coordonnées:

(s0,t0)=(0.20,0.30) 
(s0,t1)=(0.20,0.35) 
(s1,t0)=(0.25,0.30) 
(s1,t1)=(0.25,0.35) 

les poids sont:

ws = (s-s0)/(s1-s0) = 0.2 
wt = (t-t0)/(t1-t0) = 0.4 

textels de Interpole si linéaires à s direction

c0 = texture(s0,t0) + (texture(s1,t0)-texture(s0,t0))*ws 
c1 = texture(s0,t1) + (texture(s1,t1)-texture(s0,t1))*ws 

et enfin en direction t:

c = c0 + (c1-c0)*wt 

texture(s,t) rendements couleur de texel à s,t tandis que la coordonnée correspond à texel exacte et c est la couleur de texel interpolée finale.

En réalité, les coordonnées s,t sont multipliées par la résolution de texture (xs,ys) qui les convertit en unités de texel. après que s-s0 et t-t0 est déjà normalisé, donc pas besoin de diviser par s1-s0 et t1-t0 car ils sont stand égal à un. si:

s=s*xs; s0=floor(s); s1=s0+1; ws=s-s0; 
t=t*ys; t0=floor(t); t1=t0+1; wt=t-t0; 
c0 = texture(s0,t0) + (texture(s1,t0)-texture(s0,t0))*ws; 
c1 = texture(s0,t1) + (texture(s1,t1)-texture(s0,t1))*ws; 
c = c0 + (c1-c0)*wt; 

Je ne ai jamais utilisé textures 3D avant, mais dans ce cas, il utilise 8 textels et il est appelé tri-interpolation linéaire qui est 2x interpolation bilinéaire simplement prendre 2 textures les plus proches et calculer chacun interpolation bilinéaire et juste calculer la texel finale par interpolation linéaire basée sur la u coordonnée de la même manière exacte ... si

u=u*zs; u0=floor(u); u1=u0+1; wu=u-u0; 
c = cu0 + (cu1-cu0)*wu; 

zs est le nombre de textures, cu0 est résultat de interpolation bilinéaire texture à u0 et cu1 à u1. Ce même principe est utilisé pour mipmaps ...

Toutes les coordonnées peuvent avoir été de 0,5 texel excentrée et aussi la multiplication de résolution peut être fait avec xs-1 au lieu de xs en fonction de vos paramètres de serrage ...