私は自分が抱えているこの問題を研究してきましたが、それを解決するのに十分な理解が得られていないようです。:P
基本的に、私はしばらくの間iPhoneプロジェクトに取り組んでおり、最新のフレームワークとターゲット5.1をすべて使用する余裕があります。そのため、私はGLKitとGLKBaseEffectを使用してきましたが、これらは私にとっては問題なく機能しています。独自のシェーダーを作成するのではなく、GLKBaseEffectを使用して始めた理由は、glslをよく知らないためです。ただし、要件はより正確になり、基本効果はもはやそれをカットしていないようです。
私はすでにベースエフェクトを使用してすべての変換を行っているので、ベースエフェクトをそのまま維持できればいいのですが、それが理にかなっている場合は、glslタイプのシェーダーを上に追加します。
私の古いアプローチは次のようになります(これは、すべてのオブジェクトをレンダリングするループ内にあり、オブジェクトには、変換、メッシュ、およびテクスチャやマテリアルなど、この問題にとってそれほど重要ではないものが含まれています)
ObjectBase *obj = [ResourceManager.shared getObjectNamed:name inScene:sceneName];
GLKMatrix4 modelview = effect.transform.modelviewMatrix;
effect.transform.modelviewMatrix = GLKMatrix4Multiply(effect.transform.modelviewMatrix, obj.transform);
[effect prepareToDraw];
[obj render];
effect.transform.modelviewMatrix = modelView;
ここでは、オブジェクトをフェッチしてオブジェクトをレンダリングおよび変換(つまり、変換、回転、スケーリング)してから、レンダリングします。レンダリング自体がオブジェクトのメッシュをフェッチし、バッファをバインドしてレンダリングします。
ここまでは順調ですね。
ただし、呼び出し中に、オブジェクトに、より特殊なシェーダーコードを追加する[obj render];
ようなことも実行させたいと思います。glUseProgram(someProgram);
頂点シェーダーにベースエフェクトを使用しようとしていて、フラグメントシェーダーに「通常の」シェーダーを使用したいと主張する人もいるかもしれません。少なくともそれが私がやりたいと思うことです。
私はいくつかのことを試みてきました。
フラグメントシェーダーとその上に作成しようとしましたがglUseProgram
、セットアップとコンパイルの際に1つの頂点と1つのフラグメントシェーダーが必要であると表示されました。また、空の頂点シェーダーを作成しようとしましたが、うまくいきませんでした。それで何が起こるかわかりませんが、基本効果を無効にしていると思います。
最終的には、基本エフェクトを破棄して、自分のシェーダーを作成するのがおそらく最善であると考えています。窓の外で大変な作業をしているような気がするので、どれだけ節約できるかを知りたかったのです。
シェーダーについての私の理解が私に最も問題を与える部分であることを私は理解しているので、その事実を我慢してください。