2012-05-01 1 views
4

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

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

そして、与えられたシェーダを使用してオブジェクトの各フレーム、:cgGLBindProgramを用い

  1. バインド所望シェーダ(S)(頂点及び/またはピクセル)。
  2. cgGLEnableProfileを使用して、目的のシェーダのプロファイルを有効にします。
  3. cgGetNamedParameterとさまざまなパラメータ設定関数を使用して、必要な均一シェーダパラメータを取得して設定します。
  4. cgGLDisableProfile

を呼び出すことによって、シェーダをクリーンアップし、あなたのオブジェクトは通常

  • をレンダリングしかし、物事は奇妙な取得を開始。単一のシェーダを使用すると、すべてうまく動作しますが、cgGLLoadProgramで2番目のシェーダをロードすると、最初のシェーダを使用しているオブジェクトがレンダリングを停止するように見えます。描画命令を切り替えると問題が解決するように見えますが、これはほとんど解決しません。この問題は、私と私のパートナーのラップトップ(Intelのチップセットを搭載した最近のマシン)で発生します。

    デスクトップで同じコードをGeForce GTX 260でテストしたところ、すべて正常に動作しました。私はちょうど私のラップトップGPUはCgと一緒になっていないとしてこれを書くだろうが、私は正常に構築して、OGRE graphics engineを使用してラップトップで同時に複数のCgシェーダを使用するプログラムを構築して実行している(残念ながら私が現在取り組んでいる課題はコンピュータグラフィックスクラスなので、私は単にOGREを使うことはできません)。

    結論として、私は困惑しています。 OGREは私のコードは何ではないのですか? Cgを不適切に使用していますか?

  • +0

    AFAIK、cgGLEnableProfileは、初期化中にのみ呼び出される必要があります(これに対応して、cgGLDisableProfileはティアダウン中にのみ呼び出されます)。その後、単にcgGLBindProgramを呼び出してレンダリングし、何度もレンダリングします。これをやろうとしましたか? OpenGL実装は、cgGLEnableProfileをさまざまな方法で扱います。 – Ani

    +0

    @ananthonline:固定機能パイプで何かを描画する前に、プロファイルを無効にする必要があると思いますか?この時点では、私は排他的にシェーダを使用していませんが、これは最終的な計画です。 –

    +0

    CgGLBindProgram(0)だけで固定機能のパイプラインに戻すことはできませんか?いくつかのグーグルがhttp://objectmix.com/graphics/135925-disabling-cg-programs.htmlというリンクを作りました。どちらが助けになりますか? – Ani

    答えて

    2

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

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

    関連する問題