GLSL中的GL_NEAREST?

时间:2014-05-24 05:58:44

标签: opengl graphics glsl

如果我使用固定管道,我可以使用

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

制作图像'像素化'与被插值的图像中的像素之间的片段相反。我如何在GLSL计划中做同样的事情?我正在使用texture2D功能。我问,因为我正在为我的天空盒使用着色器程序,你可以看到边缘,因为边缘像素被灰色模糊。如果我使用固定管道和上面的函数调用,这个问题就解决了。

2 个答案:

答案 0 :(得分:4)

您可以使用与可编程管道相同的纹理缩小和放大滤镜。听起来问题不是min / mag过滤器,而是你如何处理纹理夹紧/包裹。或者你的纹理中有灰色,你可能不想要它们。

要设置纹理裁剪,您可以执行以下操作:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

这将导致从纹理外部采样的任何像素返回与纹理内最近的像素相同的颜色到该样本位置。

答案 1 :(得分:2)

正如其他答案和评论所指出的那样,纹理采样状态将以相同的方式影响固定功能流水线和可编程流水线。我只想在着色器中添加它,您也可以完全绕过采样并使用GLSL texelFetch()函数,您可以直接访问未过滤的纹素 - 这基本上看起来像GL_NEAREST过滤。你也将失去包装功能并且必须使用非标准化的整数纹理坐标,所以这可能不是你想要的那种情况。