Opengl &引用;“平坦”;glsl中的限定符?

Opengl &引用;“平坦”;glsl中的限定符?,opengl,glsl,shader,Opengl,Glsl,Shader,因此,我正在阅读“OpenGL官方指南”,在他们教授材质照明的一节中,他们突然在片段着色器中使用“平面”限定符作为输入变量。 我用谷歌搜索了这个问题,我想到的只是“平面着色”和“平滑着色”以及它们之间的区别,我无法理解它如何与一个简单的“MatIndex”变量相关。 以下是本书中的示例代码: struct MaterialProperties { vec3 emission; vec3 ambient; vec3 diffuse; vec3 specular; float shininess;

因此,我正在阅读“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

这是怎么回事?

这是片段着色器的属性插值方式的一部分,默认为透视正确插值

限定为平坦的变量将不进行插值。相反,它 对于三角形中的每个片段都具有相同的值。这 值将来自单个激发顶点,如 OpenGL图形系统规范。变量可以限定为 平面也可以限定为质心样本,这意味着仅将其限定为平面

积分属性需要是平坦的


您可以在第13.4节的表13.2中找到顶点为激发顶点的表格。

在一般情况下,顶点和碎片之间不存在1:1映射。默认情况下,每个顶点的关联数据在基本体上插值,以生成每个片段的相应关联数据,这就是平滑着色所做的

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

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

在您的特定示例中,代码意味着每个基本体只能有一种材质,该材质由每个基本体的激发顶点的材质ID定义。

对不起,“插值”在我们的上下文中是什么意思?英语不是我的母语,当我试图用我的语言翻译它时,我得到了“interpolsia”,这是同一个词=[@Pilpel:这是一个一般的概念,当你想绘制图形时,你应该熟悉它。使用插值,你通常有一组数据点,并试图为给定数据点之间的数据点生成值。在这个上下文中,我们有逐顶点数据,并且必须逐片段插值。想象一个逐顶点颜色的三角形。For顶点A,我们指定红色,对于顶点B,我们指定绿色,对于顶点C,我们指定蓝色。插值将在整个三角形上生成平滑的颜色渐变。