【问题标题】:Determine distance from each vertex in glsl fragment shader确定与 glsl 片段着色器中每个顶点的距离
【发布时间】:2020-04-27 13:05:01
【问题描述】:

假设我有一个像这样的简单 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 片段着色器中,我可以使用插值片段颜色来确定我与每个顶点的距离。在这个例子中,颜色的红色分量决定了到第一个顶点的距离,绿色决定了到第二个顶点的距离,蓝色决定了第三个顶点的距离。

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

【问题讨论】:

  • 没有。如果要计算距离,则必须知道 2 个点。没有内置片段着色器输入,其中包含相对于图元的坐标。

标签: opengl glsl fragment-shader


【解决方案1】:

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

  1. AMD_shader_explicit_vertex_parameter
  2. NV_fragment_shader_barycentric

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多