2017-10-12 6 views
-1

GLSLシェーダで、プログラムの起動時に値が設定される一様変数があるとしましょう。この値は、プログラムの実行中は変更されません。OpenGLユニフォーム変数persistance

私がしたいことは、私のメインのC++プログラムからこの統一変数を​​設定することです。

私の問題は、私がglUseProgramを呼び出すたびに、統一変数がクリアされているようです。私は再びglUniformXX()APIを呼び出さなければならない

glUseProgramの間に一意の変数をクリアしないようにOpenGLに指示する方法はありますか?

+1

OpenGLは、独自の値をクリアしません。あなたは実際に何が起こっているのかがはっきりしていないので、実際のコードを表示しなければなりません。 – derhass

答えて

-1

で確認することができます

あなたはこのような状況でデータの論理&ストレージを分離することをお勧めします。このような状況では、C++アプリケーションによって初期化されたGLデータを、論理呼び出しとは別のAPI呼び出しによってOpenGL & GLSLに渡すことができます。その後、プログラム、シェーダ、ユニフォーム、変数のすべてのインスタンスを追跡するデータベース型構造またはクラスを持つことは非常に便利です。

ウィンドウの設定、基本I/Oの設定、OpenGLコンテキストの設定、プログラムの作成&シェーダの作成、レンダラーまたはビデオカードへの呼び出しの呼び出しは、メインエンジンのクラスまたは構造体によって行われます。アプリケーションロジックもこれとは別にする必要があります。データ構造を別にするというこのアプローチの別の優れた点は、特定のアプリケーションから受け取った入力データを初期化プロセスに頼ってエンジンの一部として使用することです。

シェイダー&は、各プログラムのすべてのインスタンスを管理して追跡するマネージャタイプのクラスでは、コンテナ内のconstタイプと変数タイプとしてすべてのユニフォームの低コストの単一インスタンスを維持できますそれらの寿命は使用後に捨てられ、必要に応じて新しいものが作成されます。このようにして&が&の内部データセットを破棄するプログラムを無効にすると、このタイプの管理クラスをキャッシュフレンドリな方法で行う限り、簡単に取得して再初期化できる既存のデータにアクセスできます。これはまた、どのタイプのデータをスタック変数として持つか、どのタイプを動的メモリとして持つかを知ることにも依存します。テンプレートの使用は、ここではstd::shared_ptr<T> & std::unique_ptr<T>のようなスマートポインタと共に非常に便利です。私がここでスマートポインタを述べた理由は、クリーンアップを容易にし、所有権を管理するのに役立ち、単一のコンテナからユニフォーム&の両方の型を簡単に格納、作成、ディスパッチ、および削除できます。しかし、このタイプの構造はかなり複雑で、ここに表示するゲームや3Dグラフィックスエンジンの統合部分が多すぎるため、この質問に完全に答えようとする範囲を超えています。

関連する問題