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

t9eec4r0  于 2022-09-26  发布在  其他
关注(0)|答案(2)|浏览(179)

我已经设置了一个纹理,MAG_FILTING=GL_NEAREST。

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

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

当前代码为:

uniform sampler2DRect sampler1;
in vec2 vTexCoo;

main() {
   out_diffuse = texture(sampler1, vTexCoo);
}

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

yv5phkfx

yv5phkfx1#

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

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

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);绘制后解除绑定采样器,因为采样器绑定到纹理单位,而不是绑定到特定的着色器。

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

7fhtutme

7fhtutme2#

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

使用它将需要您为这个特定的绘制调用绑定采样器对象,然后解除绑定-但如果您可以这样做,您只需修改纹理滤镜参数并恢复它们,所以不清楚您从中获得了什么。

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

相关问题