4

私は Windows で OpenGL プロジェクトに取り組んでおり、GLEW を使用して、提供された Windows ヘッダーにない機能を提供しています。シェーダーのサポートには、NVIDIA の Cg を使用しています。私が読んだすべてのドキュメントとコード サンプルは、以下がシェーダーを使用してロードするための正しい方法であることを示しており、コードにこの方法で実装しました。

  1. で Cg コンテキストを作成しますcgCreateContext
  2. cgGLGetLatestProfilewithCG_GL_VERTEXおよびCG_GL_FRAGMENTをそれぞれ使用して、最新の頂点およびピクセル シェーダー プロファイルを取得します。cgGLSetContextOptimalOptions両方のプロファイルに最適なセットアップを作成するために使用します。
  3. 作成したこれらのプロファイルとシェーダーを使用して、 を使用してシェーダー プログラムを作成しますcgCreateProgramFromFile
  4. を使用してシェーダー プログラムをロードしcgGLLoadProgramます。

次に、各フレームで、特定のシェーダーを使用するオブジェクトについて:

  1. を使用して、目的のシェーダー (頂点および/またはピクセル) をバインドしますcgGLBindProgram
  2. を使用して、目的のシェーダのプロファイルを有効にしますcgGLEnableProfile
  3. cgGetNamedParameterおよびさまざまなパラメータ設定関数を使用して、必要なユニフォーム シェーダ パラメータを取得および設定します。
  4. オブジェクトを通常どおりレンダリングする
  5. を呼び出してシェーダーをクリーンアップします。cgGLDisableProfile

しかし、事態は奇妙になり始めます。1 つのシェーダーを使用すると、すべて正常に動作しますが、2 番目のシェーダーをロードするとcgGLLoadProgram、最初のシェーダーを使用しているオブジェクトのレンダリングが停止するようです。描画順序を切り替えると問題が解決するようですが、それで解決することはほとんどありません。この問題は、私とパートナーの両方のラップトップ (Intel 統合チップセットを搭載したかなり最近のマシン) で発生します。

デスクトップで GeForce GTX 260 を使用して同じコードをテストしたところ、すべて正常に動作しました。ラップトップの GPU が Cg とうまくいかないので、これを書き留めておきますが、OGRE グラフィック エンジンを使用して、ラップトップで複数の Cg シェーダーを同時に使用するプログラムをビルドして実行することに成功しました(残念ながら、私が現在取り組んでいる課題はコンピュータ グラフィックスのクラスのため、OGRE だけを使用することはできません)。

結論として、私は困惑しています。私のコードではなく、OGRE が行っていることは何ですか? Cg の使い方が間違っていませんか?

4

1 に答える 1

2

に電話cgGLEnableProfileする前に電話する必要がありますcgGLBindProgram。あなたの質問から、あなたはそれを逆にしているように見えます。

の Cg ドキュメントからcgGLBindProgram:

cgGLBindProgram は、プログラムを現在の状態にバインドします。プログラムは、バインドする前に cgGLLoadProgram でロードされている必要があります。また、バインディングを機能させるには、プログラムのプロファイルを有効にする必要があります。これは cgGLEnableProfile 関数で行うことができます。

于 2013-02-21T17:19:01.610 に答える