我有一些简单的多边形(少于 20 个顶点)在一个简单的 xy 平面上呈现平面,使用 GL_TRIANGLES 和平面颜色,2d 模拟。
我想为这些多边形添加一个可变厚度和不同颜色的边框。我使用相同的顶点和 glLineWidth/GL_LINE_LOOP 实现了一些东西,它可以工作,但是是另一个渲染通道并重复所有顶点变换。
我认为我应该能够使用 gl_FragCoord 和顶点数据和/或纹理坐标在片段着色器中执行此操作,但我不确定,而且我的幼稚尝试显然是不正确的。
我想像下面这样。
uniform vec2 scale; // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;
varying vec4 vertex; // in world coords
void main()
{
if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
{
// we're close to the edge the polygon, so we're the border.
gl_FragColor = border_color;
}
else
{
gl_FragColor = fill_color;
}
}
我要弄清楚的部分是 distance_from_edge 函数-如何计算?使用 gl_FragCoord 是不是错误的方法——我应该使用某种纹理映射吗?
作为一个实验,我尝试使用比例将顶点转换为像素空间,然后计算它与 gl_FragCoord 之间的距离(以像素为单位),但这给出了我不太理解的奇怪结果。另外我需要到边缘的距离,而不是顶点的距离,但我不知道如何得到它。
有任何想法吗?
编辑:根据尼科尔的回答,我的问题变成了:
假设我有一个三角形,其中 3 个角顶点标记为边顶点,中间的一个顶点标记为非边(因此总共渲染了 3 个三角形),那么我如何在片段着色器中插值以绘制给定的边框厚度?我假设我将边缘标志以及所需的线条粗细传递给片段着色器,它会进行一些插值计算来计算边缘与非边缘顶点之间的距离,并将颜色阈值作为边框/填充适当?