2017-05-09 5 views
1

私は現在OpenGL 3.3+と最新のシェーダベースのレンダリングプロセスを学んでいます。これまで、私はC#を使ってGLFWとOpenGLのための独自のバインディングを作成することができました。そして、すべてが今どのように動作しているかをかなりよく理解しています。私は自分のプロジェクトのすべてがどのように機能しているか知っているので、最初からすべてをやるのが好きです。OpenGL 3.3以降 - シェーダ、属性、ユニフォーム、イン/アウト変数 - どのように、いつ、いつ、なぜですか?

しかし、「スティック」したくないものは次のとおりです。イン/アウト変数、属性、ユニフォームの違いは正確です。どちらを使用するのかをどのように知るのですか?私は、OpenGL State-Machineの仕組みをかなりよく理解していると思っていますが、レンダリングプロセスのこの部分についてはほとんど詳しく説明されていません。ほとんどのチュートリアルや書籍は、「これはデータをシェーダーに渡す方法です」と言っていますが、どのメソッドを使用するかを説明するテキストはまだありません。

また、シェーダとVBO間の接続に関する情報がもう少し好きです。私はそれが上の私の質問と組み合わせることができると思います。

質問をより具体的にするもう1つの編集:バリエーション、属性、ユニフォーム、バッファオブジェクト間の関係を詳細に説明するソースはありますか?どのように機能するのですか?いつ使うの?何を避けるべきですか?次のように

+0

これは大きな質問です。特に編集に問題があります。 Attrib/Varying/Uniformとそのバインディング可能性との関係は、GLへの新規参入者にとって無限の間違いの原因です。ビーバーはそのような新人を助けることができる質の高い答えを提供しました。おそらく質問の重要性を守るのはルール違反だと思うけど...:S –

+1

@JoshParnellあなたの返事をくれてありがとうJosh。あなたのコメントを使用して私の質問にもう少し具体的に言い返しても構わないと思います。多分このスレッドでこのようにいくつかの答えを得ることができます:) – j8a2b0e7

答えて

2

シェーダの変数間の違いは次のとおりです。

属性は、頂点データ断片ごとです。これらの変数の目的は、頂点の位置に追加のデータを提供することです。各頂点に固有のテクスチャ座標、法線、および色は、属性の良い例です。最も一般的なケースでは、頂点バッファオブジェクトを作成し、このデータをシェーダの属性にアタッチすることによってシェーダにアトリビュートを提供します。

ユニフォームには、1回のレンダリングコールで変更されない値が含まれています。そのため、メッシュの変換がすべての頂点で同じであるため、行列が均一な値になることがよくあります。

シェーダ間で情報を渡すためにさまざまな方法が使用されます。これらの値は、GPU上にのみ存在します。変化量の値はポリゴン全体にわたって補間されます。 3つの頂点の値だけを提供しますが、フラグメントには3つの頂点値に基づく補間値が含まれます。

シェーダに頂点バッファを接続するには、頂点バッファをバインドし、アトリビュートポインタに関する情報を頂点バッファに渡します。

OpenGLの非常に包括的なリサーチソースである「赤い本」の最新版を入手することをお勧めします。また、OpenGLのコアプロファイルの正確なバージョンに固執します。互換モードは、すべての従来の関数を使用することができるため、さまざまなOpenGLバージョンの機能を組み合わせたWeb上に多数のチュートリアルが存在するため、まずは悪夢です。それをしないで...あなたは後悔するでしょう。 このバージョンのリファレンスカード(たとえばhttps://www.khronos.org/files/opengl4-quick-reference-card.pdf)を1つのバージョンの機能に重点を置いて入手します。