エラーチェックコードでエンジンを準備しています。私はこの状況を最善の能力で説明するつもりです。シェーダーをロードしてエラーが発生したときはいつでも(ファイルが存在しない、コンパイルエラー、問題が発生する可能性があるすべて)シェーダーを削除し、ポインターを0に設定します(これを確認する別の方法は考えられません)誤ってゴミを添付または削除しようとした場合)。これが発生した場合、プログラムを停止したくありません。誰かが誤ってゲームフォルダー内の1つのファイルを削除または変更し、そのためにゲーム全体を使用不可にしたくないからです。
さて、ポインタが0であるプログラムにシェーダをアタッチする場合、デフォルトの動作はありますか?
私のプログラムでは、頂点シェーダーが0に、フラグメントシェーダーが0に接続されている場合、OpenGLはデフォルトのプログラムを使用します(すべてが白で表示されます)。
これは、ディメンションが既にクリップスペースにある回転した立方体であり、透視投影や深度チェックなしでレンダリングされます。.objファイルから読み込まれます。
ここで、適切なフラグメントシェーダーをアタッチしたが、頂点シェーダーが0になると、次のようになります。
これは私が期待することです。フラグメントシェーダーはすべてvec4(1.0、0.3、0.7、1.0)を出力します。頂点シェーダーがないため、OpenGLはデフォルトのシェーダーを使用します(これは正しい仮定ですか?)。
ただし、正しい頂点シェーダーをアタッチしたが、フラグメントシェーダーを0にアタッチした場合(または、フラグメントシェーダーをまったくアタッチしない場合)、次のようになります。
目に見えないのは、このモデルが絶えずさまざまな色でペイントされていることです。そのため、私の画面では、黒い水平線が通る酸性の旅行のように見えます。
私は少し混乱しています。なぜなら、私は立方体がちょうど白いことを期待しているからです。私のシェーダーコードは最低限の骨であり、頂点シェーダーとフラグメントシェーダーの間で変数を交換していないことを指摘しておきます。ポインターが0に等しくないかどうかを確認しても何も変更されません。リンクされたプログラムは、ポインターに0を指定した場合と同じように動作します。私にとって最も奇妙なのは、常にゴミ箱ではなく、適切に網掛けされていることです。
編集:おそらくデフォルトのフラグメントシェーダーは、設定を省略している頂点からのgl_値を期待していますか?これは、表面が適切にシェーディングされる理由を説明するものであり、フラグメントシェーダーはスムーズなインを期待していますが、その値は単なるゴミです。
これは「未定義の振る舞い」ですか、それともどのように機能すると思われますか?