OpenGL 程序纹理抗锯齿
OpenGL procedural texture antialiasing
我使用简单的 GLSL 着色器制作了一个网格,将 纹理坐标 传递给 片段 着色器。它被应用到一个大比例平面上。
片段着色器:
#version 330 core
out vec4 fragColor;
smooth in vec2 f_TexCoord;
vec4 gridColor;
void main()
{
if(fract(f_TexCoord.x / 0.0005f) < 0.025f || fract(f_TexCoord.y / 0.0005f) < 0.025f)
gridColor = vec4(0.75, 0.75, 0.75, 1.0);
else
gridColor = vec4(0);
// Check for alpha transparency
if(gridColor.a != 1)
discard;
fragColor = gridColor;
}
如您所见,线条并不平滑,它们在 horizon 处开始 “闪烁”。
是否可以在其上应用某种 filtering/antialiasing ?我尝试增加样本数量(最多 4 个,因为更高的值会给我一个 qt 错误),但它对着色器没有影响。
切换到 GLSL 版本 4.20(至少),激活多重采样并使用 Auxiliary Storage Qualifier sample
作为顶点着色器输出(和片段着色器输入):
#version 420 core
sample smooth in vec2 f_TexCoord;
限定符导致 per-sample 插值。
我使用简单的 GLSL 着色器制作了一个网格,将 纹理坐标 传递给 片段 着色器。它被应用到一个大比例平面上。
片段着色器:
#version 330 core
out vec4 fragColor;
smooth in vec2 f_TexCoord;
vec4 gridColor;
void main()
{
if(fract(f_TexCoord.x / 0.0005f) < 0.025f || fract(f_TexCoord.y / 0.0005f) < 0.025f)
gridColor = vec4(0.75, 0.75, 0.75, 1.0);
else
gridColor = vec4(0);
// Check for alpha transparency
if(gridColor.a != 1)
discard;
fragColor = gridColor;
}
如您所见,线条并不平滑,它们在 horizon 处开始 “闪烁”。 是否可以在其上应用某种 filtering/antialiasing ?我尝试增加样本数量(最多 4 个,因为更高的值会给我一个 qt 错误),但它对着色器没有影响。
切换到 GLSL 版本 4.20(至少),激活多重采样并使用 Auxiliary Storage Qualifier sample
作为顶点着色器输出(和片段着色器输入):
#version 420 core
sample smooth in vec2 f_TexCoord;
限定符导致 per-sample 插值。