モデル、マテリアル、ライトなど、通常の 3D のものを処理するために C++ でコードを書いています。たとえば、マテリアルに均一な変数を設定するには、シェーダーからそれらのハンドルを知る必要があります。メッシュをメモリにロードするには、さまざまな場所へのハンドルを知る必要がありin
ます。
モデル、マテリアルなどにはそれぞれシェーダーへのハンドルがあり、 のようなことができるようglUniform1f(shader->getKdLocation(),kd)
になりましたが、この種のホットポテトは私には悪いデザインのようです。ユニフォームとインとアウトがシェーダーでハードコードされており (例: レイアウト = 0)、.. でバインドされているチュートリアルを見てきましたglUniform1f(0,kd)
。ただし、これは、コードの残りの部分が特別にレイアウトされたシェーダーでのみ機能することを意味するため、次善のソリューションのように思えます。また、サブルーチンに対してこれを行うことはできないと思います。これにより、これは一貫性のないオプションになります。
すべてがシェーダー リファレンスを取得するか、場合によってはシェーダー リファレンスがないと適切にインスタンス化できないか (メッシュなど)、またはより多くの場所で数値をハードコーディングするか、ハードコーディングに伴う問題に対処する必要があるかの選択のようです。
これらのモデル、ライトなどを独立してライブ/動作させ、シーンのシェーダーを設定したときにのみ「機能」できるようにする必要がありますが、これを行うための確実な方法を見つけることができないようです. 私の結論の質問は、シェーダーを処理するためのベストプラクティスは何ですか? すべての問題が解決されなくても問題ありません。適切な設計上の決定とは何か、またその理由を知りたいだけです。