ここでは、リンゴと車を比較しています。OpenGLは描画APIであり、GLSLはシェーダーコードを実装するためのプログラミング言語です。
3Dモデルはそのどちらでもありません。唯一の質問「3DモデルをOpanGLに変換するにはどうすればよいですか?」意味がありません。
出来ますか?
いいえ。それはGLSLの目的ではないためです。
モデルファイル形式を選択し(できれば、読み取りパーサーの実装は簡単です)、パーサーを実装し、適切なデータ構造を入力して、OpenGLの適切な部分にフィードし、適切な呼び出しを行って描画します。
OpenGL自体は、モデル、シーン、さらにはファイルを処理しません。GLSLはファイル形式ではなく、言語です。
OBJまたはSTLファイルから始めます。それらは、OpenGLが使用するプリミティブ型を非常によく読み、解釈し、一致させるのがかなり簡単です。
おそらく、最も読みにくい形式は.blendファイルです。事実上、.blendファイルはBlenderプロセスメモリイメージのダンプです。.blendファイルを理解するには、フル機能のBlender(またはそれに非常によく似たもの)が必要です。
コメントによる更新:
リンクしたこのエクスポータースクリプトの機能を注意深くお読みください。オブジェクトのマテリアル設定(モデル自体ではなく)を取得し、適切なフレームワークで使用した場合にGLSLコードを生成します(つまり、適切なユニフォームと属性名、マトリックスの設定など)。 。)これらのマテリアル設定に可能な限り近いシェーディング操作が行われます。スクリプトはモデルをエクスポートしません!
3Dモデルのエクスポートについて質問されました。それがモデルのメッシュであり、それを世界に配置するための属性です。マテリアルは、OBJまたはSTLファイルに保存されているものではありません。それらはテクスチャであり、そうです、シェーダーです。ただし、モデルデータ自体からは完全に独立しています。モデルがこのマテリアルを機能させるために必要なすべての頂点属性を提供する限り、複数のモデルで同じマテリアル設定を使用したり、モデルのマテリアル(テクスチャとシェーダー)を自由に交換したりすることは完全に可能です。
コメントによるアップデート2:
シェーダーが何をするのかさえ理解していますか?そうでない場合は、簡単な概要を次に示します。頂点属性データが(バッファーに)あります。これらのインデックス付き属性はOpenGLに送信されます。glDrawElementsまたはglDrawArraysの呼び出しを使用すると、属性はプリミティブ(点、線、三角形(または古いOpenGLバージョンでは四角形))として解釈されます。次に、各プリミティブはいくつかの変換を受けます。
必須:最初のステップは、ビューポートでの最終的な位置を決定する責任がある頂点シェーダーです。
オプション:頂点シェーディングの頂点の後、頂点によって形成されたプリミティブはテッセレーションシェーディングを受けます。テッセレーションは、ジオメトリを洗練するために使用されます。たとえば、地形に詳細を追加したり、曲面を滑らかにしたりします。
オプション:次は、単一の頂点を(少数の)頂点に置き換えることができるジオメトリシェーディングです。ジオメトリシェーダーは、プリミティブ型を変更する場合もあります。したがって、たとえば、単一のポイントを三角形に置き換えることができます(パーティクルシステムのレンダリングに役立ちます)。
必須:最後のステップは、プリミティブをフラグメントシェーディングすることです。ビューポート内のプリミティブの位置が決定された後、それがカバーする各ピクセルは1つ以上のフラグメントで処理されます。フラグメントシェーダーは、ターゲットフレームバッファーの最終的な色と半透明度を決定するプログラムです。
各シェーディングステップは、ユーザー定義のプログラムによって制御されます。GLSLで書かれているのは、これらのプログラム、それらが呼ばれるシェーダーです。ジオメトリではなく、モデルもありません。プログラム!そして、その時の非常に単純なプログラム。何もないところからジオメトリを生成するのではなく、OpenGLに渡された既存のジオメトリを常に処理します。
シェーダーは、モデルの定義や保存には使用されません。レンダリング時に変更するだけです。