我有一些简单的多边形(少于20个顶点)在简单的xy平面上使用GL_TRIANGLES和平面颜色进行2D模拟。使用片段着色器在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角落顶点的三角形,并在中间一个顶点标为未EDGE(3个三角形所以呈现总计),那么如何在片段着色器中插入以绘制给定厚度的边界?我假设我将边缘标志传递给了片段着色器,以及所需的线条粗细,并且它会执行一些插值计算来计算边缘与不是边缘顶点之间的距离,并将颜色阈值限制为边框/填充?
'gl_FragCoord'将是大规模对你无益。这只是告诉你片段在屏幕上的位置;它没有说明碎片相对于三角形的位置。顶点位置同样会大量无益。您将需要顶点着色器/用户提供的数据的帮助,该数据根据顶点是否是顶点将顶点的值放入顶点,然后插值。这意味着你无法检测到单个三角形的边缘;您必须将三角形分成几个三角形,以便区分内部顶点和边缘顶点。 –
谢谢,我怀疑我错过了一些东西。所以如果我有一个带有3个顶点的三角形标记为边缘顶点,并且中间的一个不是(用四个三角形渲染),那么如何内插到边界的给定线宽? – bloodearnest