|修飾子|説明|
|---|---|
|__none__|(デフォルトは省略可能) ローカル変数、読み取りおよび書き込み可能、関数の入力パラメータはこのタイプです|
|__const__|変数または関数パラメーターを読み取り専用型として宣言します|
|__attribute__| は頂点シェーダー内にのみ存在でき、通常は頂点または通常のデータを保存するために使用され、データ バッファー内のデータを読み取ることができます|
|__uniform__|シェーダーは実行時にユニフォーム変数を変更できません。ユニフォーム変数は通常、プログラムによってシェーダーに渡される変換マトリックス、マテリアル、照明パラメーターなどを配置するために使用されます。
|__variing__|主に頂点とフラグメントの間で変数を渡す役割を果たします。
__const__:
C 言語と同様に、const 修飾子によって変更された変数は、初期化後は不変です。ローカル変数に加えて、関数パラメータも const 修飾子を使用できます。ただし、構造変数は const によって変更できることに注意してください。
ただし、構造体のフィールドは機能しません。
const 変数は、「const vec3 v3 = vec3(0.,0.,0.)」と宣言されるときに初期化する必要があります。
ローカル変数では const 修飾子のみを使用できます。
関数パラメータには const 修飾子のみを使用できます。
```cpp
ストラクチャーライト {
vec4カラー;
vec3 位置;
//const vec3 pos1; //構造体のフィールドは const で変更できないため、エラーが報告されます。
};
const light lgt = light(vec4(1.0), vec3(0.0)); //構造変数はconstで変更可能
「」
__属性__:
属性変数は「グローバル」かつ「読み取り専用」であり、頂点シェーダーでのみ使用でき、浮動小数点、ベクトル、または行列変数とのみ組み合わせることができます。
一般に、属性変数はモデルの頂点、法線、色、テクスチャ、およびプログラムによって渡されるその他のデータを配置するために使用され、データ バッファーにアクセスできます。
(関数 __gl.vertexAttribPointer__ を思い出してください)
```cpp
属性 vec4 a_Position;
「」
__ユニフォーム__:
ユニフォーム変数は「グローバル」かつ「読み取り専用」であり、シェーダ全体が実行されるまでその値は変化せず、任意の基本型変数と組み合わせることができます。
一般に、外部プログラムから渡された環境データ(点光源の位置、モデルの変換行列など)を配置するには、uniform変数を使用します。
これらのデータは、明らかに、動作中に変更する必要はありません。
```cpp
均一な vec4 lightPosition;
「」
__さまざま__:
可変型変数は、頂点シェーダーとフラグメント シェーダーの間のメッセンジャーです。通常、頂点シェーダーで変更してからフラグメント シェーダーで使用しますが、フラグメント シェーダーでは使用しません。
フラグメントシェーダーで変更します。
```cpp
//頂点シェーダー
変化する vec4 v_Color;
void main(){
...
v_Color = vec4(1.,1.,1.,1);
}
// フラグメントシェーダ
変化する vec4 v_Color;
void main() {
gl_FragColor = v_Color;
}
グローバル変数修飾子は、const、attribute、uniform、variing のいずれか 1 つだけであり、複合することはできないことに注意してください。
要約と比較: __uniform__ と __attribute__ は両方ともグローバル読み取り専用です。属性は頂点シェーダーでのみ使用でき、浮動小数点数、ベクトル、または行列変数とのみ組み合わせることができます。ユニフォームは頂点シェーダーとフラグメント シェーダーで使用できます。型変数の基本的な構成と組み合わせることができます。