glsl片段着色器-如何将GL_NEAREST纹理采样为GL_LINEAR



我已经用MAG_FILTERING=GL_NEAREST设置了一个纹理。

我不希望将其设置为GL_LINEAR,但在我的一个着色器中,我希望获取纹理的内容,就好像它是GL_LINEER一样。

我一直在努力寻找答案,但找不到可靠的答案,也找不到任何例子。

当前代码为:

uniform sampler2DRect sampler1;
in vec2 vTexCoo;
main() {
out_diffuse = texture(sampler1, vTexCoo);
}

理论上我可以建立一个插值4个像素的函数,但我。。。当然,必须有某种方法来指定要使用什么过滤。

从OpenGL 3.3 Core Profile开始,您可以使用采样器对象来指定采样参数。当采样对象绑定到纹理图像单元时,它基本上会覆盖绑定纹理对象的所有内部采样器设置。

使用与以下类似的采样器始终使用线性滤波:

GLuint sampler = 0;
glGenSamplers(1, &sampler);
glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

将纹理绑定到纹理单元时,还必须绑定采样器对象。

GLuint texture_unit = //The texture unit to which your texture is bound
glBindSampler(texture_unit, sampler);

不要忘记在使用glBindSampler(texture_unit, 0);绘制后取消绑定采样器,因为采样器绑定到纹理单元,而不是特定着色器。

请注意,由于使用的是矩形纹理,因此不支持mipmapping。

OpenGL 3.3引入了Sampler Objects,它在技术上允许您的请求。当采样器对象绑定到纹理单元时,采样器对象的状态将覆盖存储在纹理对象中的采样器状态。

使用它可以重新为这个特定的绘制调用绑定采样器对象,然后取消绑定-但如果你能做到这一点,你可以简单地修改纹理过滤器参数并恢复它们,所以还不清楚你从中得到了什么。

然而,这里还有另一种可能性。使用采样器对象,可以将相同的纹理绑定到不同的单位,并使用不同的采样器选项。这可能允许您将采样器对象绑定到一些未使用的纹理单元,并让需要其他过滤的着色器只使用不同的单元,但这需要将纹理绑定到多个单元,因此仍不清楚您可以从中获得什么。。。

最新更新