そこで、私は「公式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
これはどういうことですか?
一般的なケースでは、頂点とフラグメントの間に1:1のマッピングはありません。デフォルトでは、頂点ごとの関連データはプリミティブ全体で補間され、フラグメントごとの対応する関連データを生成します。これは、smoothシェーディングが行うことです。
flat
キーワードを使用すると、補間は行われないため、その特定のプリミティブのラスタライズ中に生成されたすべてのフラグメントは同じデータを取得します。プリミティブは通常、複数の頂点によって定義されるため、この場合、1つの頂点からのデータのみが使用されることを意味します。これは、OpenGLでは 挑発的な頂点 と呼ばれます。
また、整数型は補間されないことに注意してください。いずれの場合も、mustはそれらをflat
として宣言する必要があります。
特定の例では、コードは、各プリミティブが持つことができるマテリアルを1つだけにすることを意味します。これは、各プリミティブの誘発頂点のマテリアルIDによって定義されます。
これは、フラグメントシェーダーの属性の内挿方法の一部であり、デフォルトは遠近法による正しい内挿です。
flatとして修飾された変数は補間されません。代わりに、三角形内のすべてのフラグメントに対して同じ値になります。この値は、OpenGLグラフィックシステム仕様で説明されているように、単一の挑発的な頂点から取得されます。変数はflatとして修飾できます。また、centroidまたはsample、これはflatとしてのみ修飾するのと同じことを意味します
積分属性はフラットである必要があります。
どの頂点が挑発的な頂点であるかのテーブルは、セクション13.4の openGL仕様 テーブル13.2にあります。