12

私は自分が抱えているこの問題を研究してきましたが、それを解決するのに十分な理解が得られていないようです。: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つのフラグメントシェーダーが必要であると表示されました。また、空の頂点シェーダーを作成しようとしましたが、うまくいきませんでした。それで何が起こるかわかりませんが、基本効果を無効にしていると思います。

最終的には、基本エフェクトを破棄して、自分のシェーダーを作成するのがおそらく最善であると考えています。窓の外で大変な作業をしているような気がするので、どれだけ節約できるかを知りたかったのです。

シェーダーについての私の理解が私に最も問題を与える部分であることを私は理解しているので、その事実を我慢してください。

4

2 に答える 2

18

私はそれらに興味のある人のために私の結論を出したかっただけです。

私が行ったことは、実際にはGLBaseEffectをすべて一緒に破棄し、独自のシェーダーコードを実装することです。

私の最大の問題は、いわばそれがすべてか無かということを本当に理解していなかったことです。

私が間違っているかもしれないので、私が間違っているところを訂正していただければ幸いです。これを読んでいる人をだましてはいけません。

私が努力の中で見つけたのは、いくつかの重要なポイントです。

  • GLKBaseEffectは、以前のバージョンのOpenGLESで見られた固定機能パイプラインを模倣することを目的としています。したがって、一般的なシェーダーコードをラップしているので、あまり気にする必要はありません。基本的な機能はありますが、それほど拡張性はありません。
  • 独自のシェーダーコードを作成すれば、テクスチャローダーや数学ライブラリなどのGLKitの優れた機能を引き続き使用できます。したがって、より複雑またはカスタマイズ可能なもの(バンプマッピング、トゥーンシェーディングなど)が必要な場合は、適切にレンダリングするために必要なボイラープレートコードを書き直す価値があります。私が最初にしたことは、GLKBaseEffectを使用して、非常に快適で使いやすいため、シーンの方向を決めることでした。しかし、もっとやりたいと思ったとき(接空間法線マッピング)、GLKBaseEffectによって処理されるシェーダープログラムに追加できなかったので、ちょっと行き詰まりました。
  • シェーダーは私がいつも思っていたほど怖くはありません!それが本当に何を意味するのかわからなかったのですが、それらについてたくさん読んだのに、基本的にシェーダーが固定機能パイプラインを置き換えるプログラムであることをまだ理解していなかったことに驚いています。そのような単純な。

それは私が推測するのに十分な怒りです、ただフォローアップして、私がこれまでに集めた断片を追加したかっただけです。

于 2012-06-14T12:37:28.077 に答える
11

発見したように、フラグメントシェーダーを使用して、頂点シェーダーを残すことはできません。これは、両方のタスクが異なるためです。頂点シェーダーは、頂点データ、テクスチャ(uv)などを計算し、最後に面(三角形)を描画するという頂点ごとの側面を処理します。フラグメントシェーダーは、画面(またはビューポート)の各ピクセルに正確に描画されるものを処理します。フラグメントシェーダーのみを提供する場合、頂点データが何であるかを通知するのではなく、OpenGLにピクセルに対して何かを実行するように指示するだけです。そして、これらのピクセルは、頂点シェーダーが何もしなかったので、何も/ぎこちないものを保持します(どちらかはわかりません)。

GLKEffectを使用する場合、[yourEffect prepareToDraw]メソッドの呼び出しはシェーダーなどを処理します。

ストックシェーダーペアを使用したいだけの場合は、XCode OpenGLゲームテンプレートで提供されているものを使用してみませんか?実行すると、2つのキューブがあります。1つはGLKitを使用してレンダリングされ、もう1つは通常の方法でレンダリングされます。ほとんどの効果には十分ではないと思いますが。シェーダーについて詳しく知りたい場合は、NeHeGLSLの紹介記事をご覧ください。GLSLと、コードでシェーダーを記述して使用する方法について説明します。DineyBomfimのAllAboutShadersの 記事とこのページをご覧になることをお勧めします。

GLKitを使用すると、ほとんどの場合、役に立たない反復的なコードを大量に作成する必要がなくなるため、便利です。たとえば、GLKTextureLoaderを使用できる場合は、色分けやピクセルあたりのビット数(フォーマットごと)が異なる多くの画像フォーマットを実行する必要はありませ

于 2012-06-07T17:18:04.863 に答える