opengl - GL_LINEAR到底使用什么算法?

标签 opengl textures linear-interpolation

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-s0t-t0 已经标准化,因此不需要除以 s1-s0t1-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 是纹理计数,cu0u0 纹理中双线性插值的结果和 u1 处的 cu1。同样的原理也适用于 mipmap...

所有坐标可能已偏移 0.5 纹素,并且分辨率乘法可以根据您的钳位设置使用 xs-1 而不是 xs 来完成...

关于opengl - GL_LINEAR到底使用什么算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43482392/

相关文章:

c++ - Direct3D C++ 纹理映射

ios - 如何从 ARKit 应用程序更改对象的纹理?

directx - 在 DirectX 11 中跨适配器传输纹理

r - 在 r 中的向量边界处填充 NA

c++ - 从特定类调用函数时出现段错误

c++ - OpenGL 拒绝绘制三角形

java - 按请求绘制而不是使用指定的 fps 绘制

python - 渲染到纹理 - 细节级别

opengl - OpenGL到底是如何进行透视校正线性插值的?

r - 如何在R中插值和提取黄土平滑上方的点?