【问题标题】:"flat" qualifier in glsl?glsl中的“平面”限定符?
【发布时间】:2014-12-20 14:43:20
【问题描述】:

所以我正在阅读“官方 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 glsl shader


    【解决方案1】:

    在一般情况下,顶点和片段之间不存在 1:1 映射。默认情况下,每个顶点的关联数据被插值到图元中以生成每个片段的相应关联数据,这就是 smooth 着色所做的。

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

    还要注意整数类型永远不会被插值。在任何情况下,您必须将它们声明为flat

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

    【讨论】:

    • 对不起,“插值”在我们的上下文中是什么意思?英语不是我的母语,当我尝试用我的语言翻译它时,我得到的是“interpolatsia”,这是同一个词。 =[
    • @Pilpel:interpolation 是一个通用概念,当您想要制作图形时应该让自己熟悉。使用插值,通常有一组数据点并尝试在给定数据点之间生成值。在这种情况下,我们有每个顶点的数据,并且必须对每个片段进行插值。想象一个每个顶点都有颜色的三角形。对于顶点 A,我们指定红色,对于顶点 B,我们指定绿色,对于顶点 C,我们指定蓝色。插值将在整个三角形上生成平滑的颜色渐变。
    【解决方案2】:

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

    GLSL spec section 4.5

    将不会插入限定为 flat 的变量。相反,它 对于三角形内的每个片段将具有相同的值。这 值将来自单个激发顶点,如 OpenGL 图形系统规范。一个变量可以被限定为 flat 也可以限定为 centroidsample,这与仅限定为 flat 的含义相同

    整体属性需要扁平化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2011-03-20
      • 2014-10-16
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      相关资源
      最近更新 更多