glsl中的"flat"限定符?

Pil*_*pel 9 opengl shader glsl

所以我正在阅读"官方OpenGL指南",在他们教授材料照明的部分,他们突然在片段着色器中使用"平面"限定符作为输入变量.我想知道这件事,我想出的只是"平面阴影"和"平滑着色"以及它们之间的差异,我无法理解它与简单的"MatIndex"变量有什么关系.这是本书中的示例代码:

struct MaterialProperties {
vec3 emission;
vec3 ambient;
vec3 diffuse;
vec3 specular;
float shininess;
};
// a set of materials to select between, per shader invocation
const int NumMaterials = 14;
uniform MaterialProperties Material[NumMaterials];
flat in int MatIndex; // input material index from vertex shader
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

der*_*ass 21

在一般情况下,顶点和片段之间不存在1:1映射.默认情况下,每个顶点的关联数据在基元上进行插值,以生成每个片段对应的关联数据,这就是平滑着色的作用.

使用flat关键字,不进行插值,因此在该特定基元的光栅化期间生成的每个片段将获得相同的数据.由于基元通常由多个顶点定义,这意味着在这种情况下仅使用来自一个顶点的数据.这在OpenGL中称为激发顶点.

另请注意,整数类型从不进行插值.您必须flat在任何情况下声明它们.

在您的具体示例中,代码表示每个基元只能有一个材料,该材料由每个基元的激发顶点的材质ID定义.

  • @Pilpel:[插入](https://en.wikipedia.org/wiki/Interpolation)是一个一般概念,你应该在你想要做图形时自己熟悉.通过插值,通常具有一组数据点并尝试生成给定数据点之间的值.在这个上下文中,我们有每顶点数据,并且必须按片段插入它.想象一个每个顶点有颜色的三角形.对于顶点A,我们指定红色,对于顶点B,我们指定绿色,对于顶点C,我们指定蓝色.插值将在整个三角形上生成平滑的颜色渐变. (4认同)
  • 打扰一下,“插值”在我们的上下文中意味着什么?英语不是我的母语,当我尝试将其翻译成我的语言时,我得到了“interpolatsia”,这是同一个词。=[ (2认同)

rat*_*eak 5

这是片段着色器如何插入属性的一部分,默认值是透视正确的插入。

GLSL 规范第 4.5 节中

将不会插入限定为flat的变量。相反,三角形内的每个片段都将具有相同的值。这个值将来自一个单一的挑衅顶点,如 OpenGL 图形系统规范所述。可变可以限定为 扁平也可以被称为质心样本,这将意味着同样的事情限定它仅作为

积分属性需要是平坦的。

您可以在 13.4 节的openGL 规范表 13.2 中找到哪个顶点是引发顶点的表格。