确定与 glsl 片段着色器中每个顶点的距离

Determine distance from each vertex in glsl fragment shader

假设我有一个像这样的简单 OpenGL 三角形:

//1
glColor3f(1, 0, 0);
glVertex3f(0.5, 0, 0);
//2
glColor3f(0, 1, 0);
glVertex3f(0, 1, 0);
//3
glColor3f(0, 0, 1);
glVertex3f(1, 1, 0);

在 glsl 片段着色器中,我可以使用插值片段颜色来确定我与每个顶点的距离。在这个例子中,颜色的红色分量决定了到第一个顶点的距离,绿色决定了到第二个顶点的距离,蓝色决定了到第三个顶点的距离。

有没有一种方法可以在不传递纹理坐标或颜色等顶点数据的情况下确定着色器中的这些距离?

标准 OpenGL 中没有。有两个特定于供应商的扩展:

  1. AMD_shader_explicit_vertex_parameter
  2. NV_fragment_shader_barycentric

这将使您能够访问图元中的重心坐标。但是如果没有这样的扩展,只有非常笨拙的方法才能将这些数据传输到 FS,并且每种方法都会有很大的缺点。以下是一些想法:

  • 您可以像您已经建议的那样使用逐顶点属性,但在真实网格中,需要大量额外的顶点拆分才能获得正确的值。

  • 您可以使用几何着色器动态生成这些属性值,但这会带来巨大的性能损失,因为几何着色器的性能确实不佳。

  • 您可以让 FS 可以使用您的顶点数据(例如通过 SSBO)并根据 gl_FragCoord 和相关端点基本上计算重心坐标。但这需要您获取有关哪些顶点用于 FS 的信息,这可能需要额外的数据结构(即一些三角形- and/or 基于 gl_PrimitiveID 的顶点索引查找 table)。