2017-04-18 49 views
3

refpages说:“返回最接近指定纹理坐标的四个纹理元素的加权平均值。”他们究竟如何加权?那么3D纹理呢,它仍然只使用4个像素插值或更多?GL_LINEAR使用什么算法?

+3

作为一名外部观察者,我推测这只是2D线性插值。 –

+0

@OliverCharlesworth它是双线性的...... – Spektre

回答

1
2D纹理

是用于4个样本,这意味着双线性插值所以3X 线性插值。权重是目标纹理与其4个邻居的归一化距离。

因此,例如,你想要的纹理像素的

(s,t)=(0.21,0.32) 

但质地附近纹理像素坐标为:

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

的权重分别是:

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

所以线性插值textels在s方向

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

终于在t方向:

c = c0 + (c1-c0)*wt 

,其中在s,ttexture(s,t)返回纹素的色彩,而坐标对应于准确的纹素和c是最后的内插的纹理像素的颜色。

实际上,s,t坐标乘以纹理分辨率(xs,ys),将纹理分辨率转换为纹理单元。之后s-s0t-t0已经标准化,因此不需要除以s1-s0t1-t0,因为它们的展位等于一个。所以:

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; 

我没有用过3D纹理之前,但在这种情况下,它使用8个textels,它被称为三线性插值其为2x 双线性插值简单地采取2个最接近的纹理和与双线性插值计算每刚刚计算通过基于u线性插值最终纹理像素的完全相同的方式协调......所以

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

其中zs是纹理的计数,cu0的结果双线性插值纹理在u0cu1u1。同样的原理也可用于的贴图 ...

所有的坐标可能是由0.5纹元offseted也分辨率相乘可以xs-1而不是xs根据您的钳设置来完成...