绘制抗锯齿厚镶嵌曲线

Draw anti-aliased thick tessellated curves

所以我可以使用曲面细分着色器绘制曲线,但是出来的线条非常细且锯齿状(锯齿状)。我很困惑,因为我如何处理这些新点(等值线),从 tessellation eval shaderfragment shader 并使其更厚和别名。

我知道它们有多种方法,例如使用几何着色器甚至顶点着色器来计算相邻顶点并创建多段线。但我的目标不是创建多段线,只是一个恒定的厚度和抗锯齿线(边缘)。我认为片段着色器就足够了。

请告知什么是实现此目标的最佳和最快方法,以及如何将“等值线”数据从曲面细分着色器传递到片段着色器并对其进行操作。任何显示从 TES 到 FS 的数据传输的小代码都会非常有用。请原谅我,因为我是初学者,所以我上面的许多假设可能是不正确的。

顶点着色器:这是一个简单的直通着色器,所以我不在此处添加。

曲面细分评估着色器:

#version 450

layout( isolines ) in;

uniform mat4 MVP;

void main()
{

    vec3 p0 = gl_in[0].gl_Position.xyz;
    vec3 p1 = gl_in[1].gl_Position.xyz;
    vec3 p2 = gl_in[2].gl_Position.xyz;

    float t = gl_TessCoord.x;
    float one_minus_t = (1.0 - t);
    float one_minus_t_square = one_minus_t * one_minus_t;
    float t_square = t * t;
    float two_times_one_minus_t = 2 * one_minus_t;

    // Bezier interpolation
    vec3 p = one_minus_t_square * p0 + two_times_one_minus_t*t*p1 + t_square * p2;

    gl_Position = vec4(p, 1.0);

}

片段着色器:为 gl_FragColor

分配统一颜色的基本着色器

输出:

如果你想画一条平滑的粗线,你有3种选择:

  1. 绘制具有许多顶点的高度细分的多边形。

  2. 在整个视口上绘制一个四边形并丢弃不在线上的任何片段(在片段着色器中)。

  3. 混合选项 1 和 2。绘制一个比线大并包围线的粗略多边形。丢弃边角处的片段以平滑线条(在片段着色器中)。