これが正しい用語かどうかはわかりませんが、私がやろうとしているのは、OpenGL ES 2.0 で GLSL シェーダー用の一種の「パイプ」を作成することだと思います。これは、私のエンジンのグラフィック パイプに組み込まれる便利なコンポーネントになるという考えです。私のターゲット プラットフォームは Android です。この背後にある私の設計方法論について、いくつかの批判をお願いします。一言で言えば、いくつかの設定を指定して値を追加するだけの動的処理パイプを作成するか、最小限の自動化を行って物事を比較的低レベルに保つかのいずれかに直面しているようですどのくらいのコードが書かれているのか、コードが何をしているのか。
詳細
これまでのところ、私の設計方法論は次のとおりです。
- シェーダー ファイルは assets フォルダーに格納されます
- Java はフロントエンドとして機能し、すべてのシェーダー ファイルを取得し、シェーダーのタイプと元のシェーダー ソースに関する情報を含む Shader オブジェクトにそれぞれを格納します。
- 次に、Java はシェーダー データをこれらのカスタム シェーダー オブジェクト (つまり、OpenGL シェーダー オブジェクトではありません) の配列で C++ に送信し、JNI によって解析されます。
- その後、JNI は Java 経由で取得したシェーダー ソースを ShaderHandler クラス シングルトンに送信します。これは、
std::vector< std::vector< GLuint > >
シェーダーの各タイプ (頂点用、フラグメント用、テクスチャ用など) ごとに多次元を保持します。- ShaderHandler クラスは、シェーダー オブジェクトをプログラム可能なインターフェイスにコンパイルおよびリンクします。これが完了すると、動的に値を割り当てることで、ShaderVariable ハンドラーとして機能するコンポーネント クラスにその機能を拡張することで、多くの重労働を処理します。たとえば、変更する値/ベクトル/マトリックス/任意のものとインデックスの数を指定し、それを ShaderVariable ハンドラーに渡すことができます。その SVH が取得されるとすぐに
std::map
、変数の名前を識別子として使用して、それを に格納します。
- ShaderHandler クラスは、シェーダー オブジェクトをプログラム可能なインターフェイスにコンパイルおよびリンクします。これが完了すると、動的に値を割り当てることで、ShaderVariable ハンドラーとして機能するコンポーネント クラスにその機能を拡張することで、多くの重労働を処理します。たとえば、変更する値/ベクトル/マトリックス/任意のものとインデックスの数を指定し、それを ShaderVariable ハンドラーに渡すことができます。その SVH が取得されるとすぐに
- プロンプトが表示されると、これらの SVH オブジェクト (ShaderHandler クラスに存在するベクトルに格納されます) は基本的に、std::map に存在する値の属性とユニフォームを動的にバインドします。
割り当てられたメモリの一部はポインターを介して行われますが、確かに、そのほとんどはスタックで構成されています。Androidフォンでは、このような方法論を使用すると、優れたグラフィックスなどを備えたやや野心的なゲームでスタックオーバーフローが非常に達成可能になると想像できるため、これについてより動的なメモリ割り当てを検討する必要があるかどうか疑問に思っています。
考え?