私は Windows で OpenGL プロジェクトに取り組んでおり、GLEW を使用して、提供された Windows ヘッダーにない機能を提供しています。シェーダーのサポートには、NVIDIA の Cg を使用しています。私が読んだすべてのドキュメントとコード サンプルは、以下がシェーダーを使用してロードするための正しい方法であることを示しており、コードにこの方法で実装しました。
- で Cg コンテキストを作成します
cgCreateContext
。 cgGLGetLatestProfile
withCG_GL_VERTEX
およびCG_GL_FRAGMENT
をそれぞれ使用して、最新の頂点およびピクセル シェーダー プロファイルを取得します。cgGLSetContextOptimalOptions
両方のプロファイルに最適なセットアップを作成するために使用します。- 作成したこれらのプロファイルとシェーダーを使用して、 を使用してシェーダー プログラムを作成します
cgCreateProgramFromFile
。 - を使用してシェーダー プログラムをロードし
cgGLLoadProgram
ます。
次に、各フレームで、特定のシェーダーを使用するオブジェクトについて:
- を使用して、目的のシェーダー (頂点および/またはピクセル) をバインドします
cgGLBindProgram
。 - を使用して、目的のシェーダのプロファイルを有効にします
cgGLEnableProfile
。 cgGetNamedParameter
およびさまざまなパラメータ設定関数を使用して、必要なユニフォーム シェーダ パラメータを取得および設定します。- オブジェクトを通常どおりレンダリングする
- を呼び出してシェーダーをクリーンアップします。
cgGLDisableProfile
しかし、事態は奇妙になり始めます。1 つのシェーダーを使用すると、すべて正常に動作しますが、2 番目のシェーダーをロードするとcgGLLoadProgram
、最初のシェーダーを使用しているオブジェクトのレンダリングが停止するようです。描画順序を切り替えると問題が解決するようですが、それで解決することはほとんどありません。この問題は、私とパートナーの両方のラップトップ (Intel 統合チップセットを搭載したかなり最近のマシン) で発生します。
デスクトップで GeForce GTX 260 を使用して同じコードをテストしたところ、すべて正常に動作しました。ラップトップの GPU が Cg とうまくいかないので、これを書き留めておきますが、OGRE グラフィック エンジンを使用して、ラップトップで複数の Cg シェーダーを同時に使用するプログラムをビルドして実行することに成功しました(残念ながら、私が現在取り組んでいる課題はコンピュータ グラフィックスのクラスのため、OGRE だけを使用することはできません)。
結論として、私は困惑しています。私のコードではなく、OGRE が行っていることは何ですか? Cg の使い方が間違っていませんか?