GLSLシェーダーを使用してテクスチャの変換を実行するiPhoneアプリを書いていますが、GLSLシェーダーに変数を渡すことで少し苦労している点があります。
OpenGL状態の一部をシェーダーに読み取らせることができることを読みました(そして、この変数への読み取り専用アクセスのみが必要です)が、その交換がどのように行われるかはわかりません。
つまり、フラグメントシェーダーの外部で作成されたfloat値を取得して、フラグメントシェーダーにアクセスできるようにしようとしています(シェーダーの内部から渡されるか読み取られるかに関係なく)。
あなたが提供できるどんな助け/ポインタにも感謝します、それは非常にありがたいです!
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ユニフォーム変数」をグーグルすることで見つけることができます。
それがお役に立てば幸いです。