2025/10/15 02:04 Upgrading Our Way Through OpenGL 1.x

ロボ子、今日はOpenGLの初期バージョンについて話すのじゃ!

OpenGLですか、博士。初期バージョンはどのような特徴があったのでしょうか?

OpenGL 1.0は非常にシンプルで、拡張を前提とした基盤として設計されたのじゃ。例えば、テクスチャの読み込みには`glTexImage2D()`を使うのじゃ。

`glTexImage2D()`ですか。ピクセル行の配置はどのように設定するのですか?

`GL_UNPACK_ALIGNMENT`で設定するのじゃ!画面クリアには`glClearColor()`と`glClear()`、描画色には`glColor4f()`を使うぞ。

なるほど。テクスチャの拡大・縮小方法や範囲外の処理はどうなっていたのでしょう?

`glTexParameteri()`で設定し、`GL_CLAMP`でテクスチャ範囲外の処理を指定するのじゃ。描画の開始と終了は`glBegin()`と`glEnd()`、頂点座標は`glVertex4f()`で指定するぞ。

OpenGL 1.1では、どのような機能が追加されたのですか?

1.1では、テクスチャオブジェクトと頂点配列が導入されたのじゃ!テクスチャオブジェクトは`glGenTextures()`、`glBindTexture()`、`glDeleteTextures()`で管理するぞ。

テクスチャの一部を更新する関数もあるのですね。

そう、`glTexSubImage2D()`でテクスチャの一部を更新できるのじゃ。頂点配列は`glVertexPointer()`、`glColorPointer()`、`glTexCoordPointer()`で設定し、`glEnableClientState()`と`glDisableClientState()`で有効・無効を切り替えるのじゃ。

`glDrawArrays()`で頂点配列を使って描画するのですね。

その通り!頂点属性をインターリーブして、`glVertexPointer()`と`glTexCoordPointer()`のstride値で指定することもできるのじゃ。

OpenGL 1.2や1.3では、どのような変更がありましたか?

1.2では`GL_CLAMP_TO_EDGE`オプションが追加され、`GL_CLAMP`の動作が改善されたのじゃ。1.3ではマルチテクスチャリングが導入され、`glActiveTexture()`でアクティブなテクスチャユニットを選択できるようになったぞ。

OpenGL 1.5では、頂点バッファオブジェクト(VBO)が導入されたのですね。

`glGenBuffers()`、`glBindBuffer()`、`glBufferData()`でVBOを管理し、`glVertexPointer()`などの関数でVBO内のオフセットを指定するのじゃ。

ウィンドウサイズが変更された場合、何か特別な処理が必要ですか?

`glViewport()`でOpenGLに通知する必要があるのじゃ。モデルビュー行列とプロジェクション行列を使って、オブジェクトのスケール、位置、向きを調整するぞ。

行列はどのように操作するのですか?

`glMatrixMode()`、`glLoadIdentity()`、`glScalef()`などを使うのじゃ。OpenGLプログラムの実際の制限はランタイムまで不明で、`glGet()`関数で特定の制限を問い合わせることができるぞ。

テクスチャサイズの最小保証はどれくらいですか?

OpenGL 1.xおよび2.xでは、64x64ピクセルが最小保証じゃ。2.0以降では、非2の累乗テクスチャが必須になったのじゃ。

OpenGLの進化はすごいですね。博士、今日はありがとうございました。

どういたしまして。ところでロボ子、OpenGLって、お風呂に入りながらプログラミングするのに向いてると思う?

博士、それは完全にショートします!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
