0

私のゲームには、シェーダー、フレームバッファー、および描画を処理するレンダリング モジュールがあります。ここで、これら 3 つのタスクのロジックを個別にカプセル化したいと思います。アイデアは、レンダリング モジュールを 3 つのモジュールに分割することです。コードの複雑さを軽減し、ライブシェーダーのリロードを簡単に実装するためにこれを行いますが、私の質問にとっては重要ではありません。

描画モジュールは空のシェーダー オブジェクトを作成glCreateProgram()し、それらをソース ファイルへのパスと共にグローバルに保存します。シェーダー モジュールはそれらをチェックし、ソース ファイルをロードしてコンパイルし、リンクすることで実際のシェーダーを作成します。

ただし、この概念では、レンダー モジュールが既に描画を望んでいるが、シェーダー モジュールが実際のシェーダーを作成していない場合が発生する可能性があります。私の質問は、空のシェーダー プログラムで描画することは有効ですか? これが発生したときに画面が黒くなることは、私にとってはまったく問題ありません。シェーダーの作成はすぐに準備が整うはずなので、遅れは気にならないかもしれません。

空のシェーダー プログラムで描画することは有効ですか? 他の場所にロードされたシェーダーのアイデアを実装するにはどうすればよいですか?

4

2 に答える 2

1

ドキュメント内の関連する 2 行:

シェーダー オブジェクトで実行できるすべての操作は、シェーダー オブジェクトがプログラム オブジェクトにアタッチされているかどうかに関係なく有効です。ソース コードがシェーダー オブジェクトにロードされる前、またはシェーダー オブジェクトがコンパイルされる前に、シェーダー オブジェクトをプログラム オブジェクトにアタッチすることは許容されます。

programがゼロの場合、現在のレンダリング状態は無効なプログラム オブジェクトを参照しており、シェーダーの実行結果は未定義です。ただし、これはエラーではありません。プログラムにタイプ GL_FRAGMENT_SHADER のシェーダー オブジェクトが含まれていない場合、実行可能ファイルが頂点にインストールされ、場合によってはジオメトリ プロセッサにもインストールされますが、フラグメント シェーダーの実行結果は未定義になります。

そのため、それは可能であるように見えますが、すべてのマシンで同じ結果が得られるとは限りません。

于 2013-03-17T14:35:47.743 に答える
1

「有効」と「空」をどのように定義しますか?

プログラム オブジェクトの最後のリンクが成功しなかった場合 (または最後のリンクがなかった場合)、その呼び出しglUseProgramGL_INVALID_OPERATIONエラーになります。これは、それが失敗することも意味するglUseProgramため、現在のプログラムは変更されません。したがって、すべてのglUniform呼び出しは、新しいプログラムではなく、そのプログラムを参照します。そのプログラムがゼロの場合、より多くのGL_INVALID_OPERATIONエラーが発生します。

現在のプログラムがない場合 (つまり、プログラムが 0 の場合)、レンダリングを試みると未定義の動作が発生します。

未定義の動作はニーズに対して「有効」ですか? そのフレームを (スワップ バッファーを呼び出さないことによって) ユーザーに表示しない場合は、何をレンダリングするかは重要ではありません。これらすべてのエラーが OpenGL エラー キューに「有効」になっていますか?

于 2013-03-17T14:41:01.280 に答える