【发布时间】:2012-03-22 02:28:10
【问题描述】:
我想自己在 GLSL 着色器中实现纹理过滤(min 和 magfilter)(因为我想使用 image_load_and_store 而不是采样器,而且我想以特殊方式处理未定义的像素),我正在寻找用于讨论过滤过程的文章。
我可以回忆起如何从我曾经写过的光线追踪器中实现纹理过滤 - 我认为你需要考虑每个像素的 UV 梯度,并根据这些梯度的长度以某种方式缩放你的采样光栅......但我在那里使用一个 49 个样本的圆形内核,我认为这太重了。
我认为我可以使用 dFdx() 和 dFdy() 获得 UV 渐变 - 但我想知道 openGL 使用哪种内核进行过滤并以相同的方式在我的 glsl 着色器中实现它。
还有 - 如何区分是否需要应用 minfilter 或 magfilter?过滤过程有什么不同吗?
最后但同样重要的是:如果是缩小过滤,如何根据 UV 梯度选择合适的 mipmap 级别?
【问题讨论】:
-
出于好奇,你为什么要这么做?
-
通常,纹理过滤和采样是使用硬件执行的。这肯定会很困难,更不用说在着色器中实现性能密集型了。
-
这是图形研究,因此我们正在模拟未来可能由硬件支持的功能。我这样做有两个原因:首先,我需要使用 image_load_and_store(我实际上不知道我是否可以使用与我也用作 ImageStore 目标的采样器相同的纹理?)第二个原因是我想用以特殊方式获取值“NaN”(如果其中一个纹素为 NaN,则常规过滤只会使整个像素变为 NaN)