refpages 说“返回最接近指定纹理坐标的四个纹理元素的加权平均值。”它们的权重到底是怎样的?那么 3D 纹理呢,它仍然只使用 4 个或更多纹理像素进行插值吗?
最佳答案
在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
在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
其中 texture(s,t)
返回 s,t
处的纹素颜色,而坐标对应于精确的纹素,而 c
是最终的插值纹理像素颜色。
实际上,s,t
坐标乘以纹理分辨率 (xs,ys
),将它们转换为纹素单位。之后 s-s0
和 t-t0
已经标准化,因此不需要除以 s1-s0
和 t1-t0
因为它们的 Booth 等于 1。所以:
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个纹理,它被称为三线性插值,它是2x双线性插值 只需采用 2 个最近的纹理并使用双线性插值计算每个纹理,然后以完全相同的方式基于 u
坐标通过线性插值计算最终纹理元素...所以
u=u*zs; u0=floor(u); u1=u0+1; wu=u-u0;
c = cu0 + (cu1-cu0)*wu;
其中 zs
是纹理计数,cu0
是 u0
纹理中双线性插值的结果和 u1
处的 cu1
。同样的原理也适用于 mipmap...
所有坐标可能已偏移 0.5 纹素,并且分辨率乘法可以根据您的钳位设置使用 xs-1
而不是 xs
来完成...
关于opengl - GL_LINEAR到底使用什么算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43482392/