37

GLSLシェーダーを使用してテクスチャの変換を実行するiPhoneアプリを作成していますが、少し苦労している点の1つは、変数をGLSLシェーダーに渡すことです。

OpenGL状態の一部をシェーダーに読み取らせることができることを読みました(そして、この変数への読み取り専用アクセスのみが必要です)が、その交換がどのように行われるかはわかりません。

つまり、フラグメントシェーダーの外部で作成されたfloat値を取得して、フラグメントシェーダーにアクセスできるようにしようとしています(シェーダーの内部から渡されるか、読み取られるかは関係ありません)。

あなたが提供できるどんな助け/ポインターにも感謝します、それは非常にありがたいです!

4

1 に答える 1

73

1つのオプションは、均一変数を介して情報を渡すことです。

glUseProgram(myShaderProgram);

あなたが使用することができます

GLint myUniformLocation = glGetUniformLocation(myShaderProgram, "myUniform");

そして例えば

glUniform1f(myUniformLocation, /* some floating point value here */);

頂点シェーダーまたはフラグメントシェーダーで、次の宣言を追加する必要があります。

uniform float myUniform;

これで、シェーダーで、を介して以前に渡した値に(読み取り専用で)アクセスできるようになりましたglUniform1f

もちろん、均一変数は、配列、構造体、行列などの複雑な型を含む、任意の有効なGLSL型にすることができます。OpenGLは、glUniform各タイプに適した通常のサフィックスを持つ関数を提供します。たとえば、タイプの変数に割り当てるには、またはvec3を使用します。glUniform3fglUniform3fv

glBegin注:シェーダーの実行中、つまり/glEndブロックで値を変更することはできません。これは読み取り専用であり、処理されるすべてのフラグメント/頂点で同じです。

ユニフォームを使用したチュートリアルもいくつかあります。「glslユニフォーム変数」をグーグルで検索すると、それらを見つけることができます。

それがお役に立てば幸いです。

于 2010-07-12T07:59:37.490 に答える