web-dev-qa-db-ja.com

変数をOpenGL GLSLシェーダーに渡す

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

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

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

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

35

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

glUseProgram(myShaderProgram);

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

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

そして例えば

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

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

uniform float myUniform;

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

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

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

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

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

63
Greg S