glsl 構文の変数修飾子

|修飾子|説明|

|---|---|

|__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__ は両方ともグローバル読み取り専用です。属性は頂点シェーダーでのみ使用でき、浮動小数点数、ベクトル、または行列変数とのみ組み合わせることができます。ユニフォームは頂点シェーダーとフラグメント シェーダーで使用できます。型変数の基本的な構成と組み合わせることができます。

おすすめ

転載: blog.csdn.net/u012861978/article/details/126511843