绘制抗锯齿粗镶嵌曲线

时间:2021-06-25 16:32:33

标签: opengl glsl

所以我可以使用曲面细分着色器绘制曲线,但是出来的线条非常细且呈锯齿状(锯齿状)。我很困惑如何处理这些新点(等值线),从 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);

}

Fragment Shader : 为 gl_FragColor 分配统一颜色的基本着色器

输出:

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

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

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

相关问题