"平坦" glsl中的限定符?

时间:2014-12-20 14:43:20

标签: opengl glsl shader

所以我正在阅读"官方OpenGL指南"在他们教材料照明的部分,他们突然使用了#34; flat"片段着色器中输入变量的限定符。 我知道了这件事,我想出的只是"平面阴影"和"平滑阴影"和它们之间的差异,我无法理解它是如何与一个简单的" 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

这是怎么回事?

2 个答案:

答案 0 :(得分:20)

在一般情况下,顶点和片段之间没有1:1的映射。默认情况下,每个顶点的关联数据在基元上进行插值,以便为每个片段生成相应的关联数据,这就是 smooth 着色所做的。

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

另请注意,永远不会插入整数类型。 必须在任何情况下都将其声明为flat

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

答案 1 :(得分:4)

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

GLSL spec section 4.5

中的

  

不会插入限定为 flat 的变量。相反,它   对于三角形内的每个片段,它将具有相同的值。这个   值将来自一个引发顶点,如下所述   OpenGL图形系统规范。变量可以被限定为   平面也可以被认定为质心示例,这与将其限定为 flat 的意思相同

积分属性需要平坦。

你可以在13.4节的openGL spec表13.2中找到哪个顶点是引发顶点的表。