私は、Windows上でOpenGLプロジェクトに取り組んでいます.GLEWを使用して、提供されているWindowsヘッダには欠けている機能を提供しています。シェーダのサポートのために、私はNVIDIAのCgを使用しています。私は読んだことがあるすべてのドキュメントやコードサンプルは、以下が使用してシェーダをロードするための正しい方法であることを示している、と私は私のコードで物事をこのように実装しました: OpenGLに関するCgの問題
- が
cgCreateContext
でのCgコンテキストを作成します。 cgGLGetLatestProfile
を使用して最新の頂点シェーダープロファイルとピクセルシェーダープロファイルをそれぞれCG_GL_VERTEX
とCG_GL_FRAGMENT
で取得します。cgGLSetContextOptimalOptions
を使用して、両方のプロファイルに最適なセットアップを作成します。- これらのプロファイルとシェーダーを使用して、
cgCreateProgramFromFile
を使用してシェーダープログラムを作成します。 cgGLLoadProgram
を使用してシェーダープログラムをロードします。
そして、与えられたシェーダを使用してオブジェクトの各フレーム、:cgGLBindProgram
を用い
- バインド所望シェーダ(S)(頂点及び/またはピクセル)。
cgGLEnableProfile
を使用して、目的のシェーダのプロファイルを有効にします。cgGetNamedParameter
とさまざまなパラメータ設定関数を使用して、必要な均一シェーダパラメータを取得して設定します。cgGLDisableProfile
を呼び出すことによって、シェーダをクリーンアップし、あなたのオブジェクトは通常
cgGLLoadProgram
で2番目のシェーダをロードすると、最初のシェーダを使用しているオブジェクトがレンダリングを停止するように見えます。描画命令を切り替えると問題が解決するように見えますが、これはほとんど解決しません。この問題は、私と私のパートナーのラップトップ(Intelのチップセットを搭載した最近のマシン)で発生します。 デスクトップで同じコードをGeForce GTX 260でテストしたところ、すべて正常に動作しました。私はちょうど私のラップトップGPUはCgと一緒になっていないとしてこれを書くだろうが、私は正常に構築して、OGRE graphics engineを使用してラップトップで同時に複数のCgシェーダを使用するプログラムを構築して実行している(残念ながら私が現在取り組んでいる課題はコンピュータグラフィックスクラスなので、私は単にOGREを使うことはできません)。
結論として、私は困惑しています。 OGREは私のコードは何ではないのですか? Cgを不適切に使用していますか?
AFAIK、cgGLEnableProfileは、初期化中にのみ呼び出される必要があります(これに対応して、cgGLDisableProfileはティアダウン中にのみ呼び出されます)。その後、単にcgGLBindProgramを呼び出してレンダリングし、何度もレンダリングします。これをやろうとしましたか? OpenGL実装は、cgGLEnableProfileをさまざまな方法で扱います。 – Ani
@ananthonline:固定機能パイプで何かを描画する前に、プロファイルを無効にする必要があると思いますか?この時点では、私は排他的にシェーダを使用していませんが、これは最終的な計画です。 –
CgGLBindProgram(0)だけで固定機能のパイプラインに戻すことはできませんか?いくつかのグーグルがhttp://objectmix.com/graphics/135925-disabling-cg-programs.htmlというリンクを作りました。どちらが助けになりますか? – Ani