【发布时间】:2012-11-10 03:58:41
【问题描述】:
我想知道是否有人拥有完整、有效且有效的代码来在 glsl 中进行双三次纹理过滤。有这个:
http://www.codeproject.com/Articles/236394/Bi-Cubic-and-Bi-Linear-Interpolation-with-GLSL 要么 https://github.com/visionworkbench/visionworkbench/blob/master/src/vw/GPU/Shaders/Interp/interpolation-bicubic.glsl
但两者都进行了 16 次纹理读取,而只需要 4 次:
https://groups.google.com/forum/#!topic/comp.graphics.api.opengl/kqrujgJfTxo
但是,上面的方法使用了一个我不知道它应该做什么的缺失的“cubic()”函数,并且还采用了一个无法解释的“texscale”参数。
还有NVidia版本:
但我相信这使用了 CUDA,它是 NVidia 显卡特有的。我需要 glsl。
我可能可以将 nvidia 版本移植到 glsl,但我想我会先询问是否有人已经拥有完整的、工作的 glsl 双三次着色器。
【问题讨论】:
-
"但两者都进行了 16 次纹理读取,而只有 4 次是必需的:" 那篇文章是在骗你。双三次插值不进行 4 次双线性采样;这只是更大规模的线性过滤。双三次插值需要对值进行 cubic 插值,而不是线性插值。而且你不能通过做一堆线性插值来做三次插值。这就像贝塞尔曲线和通过连接 4 个贝塞尔点创建的线之间的差异。这不完全一样,是吗?
-
我发布的着色器做了类似 texcoord =cubic(lerp(texcoord)) 的操作,因此它基本上在纹理坐标插值之上应用了额外的功能。这种类型的过滤可用于调整图像大小。
-
@NicolBolas:你错了;正如GPUGems 2 chapter 中所述以及下面由 JAre 和 Maf 编写的,完全可以使用 4 个线性插值执行双三次查找。
-
@NicolBolas 你不能通过做一堆线性插值来做三次插值。这在技术上是不正确的,这就是 De Casteljau 算法的工作原理
-
GPUGems 文章不是 CUDA。它是 Cg 或 HLSL。
标签: glsl fragment-shader bicubic