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定义.
这是片段着色器如何插入属性的一部分,默认值是透视正确的插入。
将不会插入限定为flat的变量。相反,三角形内的每个片段都将具有相同的值。这个值将来自一个单一的挑衅顶点,如 OpenGL 图形系统规范所述。可变可以限定为 扁平也可以被称为质心或样本,这将意味着同样的事情限定它仅作为平
积分属性需要是平坦的。
您可以在 13.4 节的openGL 规范表 13.2 中找到哪个顶点是引发顶点的表格。
| 归档时间: |
|
| 查看次数: |
17361 次 |
| 最近记录: |