VisualStudio2022で始める3Dプログラミング / OpenGL / Windows10
※ブログで公開していた記事の抜粋(OpenGL)です。
Windows&C++で3DプログラミングするならDirectXかOpenGLだと思いますが、最新バージョン(DirextX12など)は、性能重視のため手軽にプログラミングができなくなっています。
なので古いバージョンで使えるものを調べて、プログラミングができる環境を作ってみました。
作成した環境は、OpenGL1.1、OpenGL4.5、DirectX9、DirectX11、DirectX12で、初期化と画面クリア、簡単なポリゴンの描画まで行っています。
VSプロジェクト、ソースコードを公開していますので、3Dプログラミングの参考にしてください。
記事最後にあるダウンロードボタンから取得できます。
Visual Studio 2022インストール
特に説明は不要だと思います。OpenGLなのでC++がビルドできるようにしてください。グラフィックボードがOpenGLに対応していれば、特に何もしなくても使える状態になっています。
OpenGL1.1
簡単な3Dプログラムならこれで十分だと思います。Windows環境以外でも多くの環境で対応していて、本、ネットなどから簡単に情報を入手できます。古いAPIなのでシェーダや複雑な処理はできません。
ヘッダーとライブラリファイル
#include <gl/gl.h>;
#pragma comment(lib,"OpenGL32.lib")
初期化と終了処理
簡単に初期化を行える外部ライブラリがありますが使用せずに、Windows用のOpenGL関数(wgl~)のみを使った方法を紹介します。
//デバイスコンテキスト取得
g_hDC = GetDC(hwnd);//hwnd:ウインドウハンドル
//OpenGLが使用可能なピクセルフォーマットを取得
PIXELFORMATDESCRIPTOR pfdesc;
ZeroMemory(&pfdesc, sizeof(pfdesc));
pfdesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfdesc.nVersion = 1;
pfdesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfdesc.iPixelType = PFD_TYPE_RGBA;
pfdesc.cColorBits = 32;
pfdesc.cDepthBits = 24;
pfdesc.cStencilBits = 8;
int format = ChoosePixelFormat(hDC, &pfdesc);
//format==0 失敗 対応したフォーマットがない
// 取得したピクセルフォーマットを設定
// これで指定したウインドウがOpenGLで使用可能に
SetPixelFormat(hDC, format, &pfdesc));
//OpenGLコンテキスト作成
hGL = wglCreateContext(hDC);
wglMakeCurrent(hDC, hGL)) {
//ここからOpenGL関数(gl~)が使用可能になる
//削除
//OpenGLコンテキストの削除
wglDeleteContext(hGL);
//デバイスコンテキスト解放
ReleaseDC(hwnd, hDC);
簡単な描画処理例
ポリゴンを描画するには、頂点や色などを1つずつ関数を呼び出して行います。簡単ですが効率は悪いです。ライティングは決められた計算方法のみで、シェーダーはありません。
//画面クリア
glClearColor(0.0f, 0.125f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//ポリゴン描画
glBegin(GL_TRIANGLES);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.5f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glEnd();
//描画処理を実行
glFlush();
//ダブルバッファ(描画バッファと表示バッファ)入れ替え
//Windows用関数 g_hDC:デバイスコンテキスト
SwapBuffers(g_hDC);
OpenGL4
シェーダーなど新しい機能に対応したバージョンです。描画処理もDirectXのような頂点バッファとシェーダーを使った方法に変更され、古い描画処理と固定のライティング機能は廃止されています。また使用するにはグラフィックボードのドライバーが対応している必要があり、利用できる環境が制限されます。
古いバージョンの情報が多く、新しいバージョンの情報を探すのに少し苦労します。
追記2022/7/13
現在逆になっています。古い情報(ver1.1)を探すのに苦労します。
ヘッダーとライブラリファイル
glext.hというヘッダファイルが必要になります。
新しいバージョンのlibファイルはなく、実行時に動的なリンク処理(関数ポインタの取得)が必要になります。
#include <gl/gl.h>
#include "glext.h"
#pragma comment(lib,"OpenGL32.lib")
初期化と終了処理
ウインドウの初期化などはOpenGL1.1と同じです。新しい機能を使うために実行時に動的なリンク処理(wglGetProcAddress)を行います。ここでは使用していませんが、この処理を行う外部ライブラリ(glewなど)があります。
// 関数ポインタ取得
// 未対応の場合NULLポインタ
PFNGLBINDVERTEXBUFFERPROC glBindVertexBuffer;
glBindVertexBuffer = (glBindVertexBuffer)wglGetProcAddress("glBindVertexBuffer");
//関数呼び出し
glBindVertexBuffer(GL_ARRAY_BUFFER, id)
簡単な描画処理例
頂点バッファやシェーダーの作成は長いため、描画処理の部分のみです。
//画面クリア
glClearColor(0.0f, 0.125f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//シェーダー
glUseProgram(ProgID);
//属性0に頂点の位置データを割り当て
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBuffID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
// 三角形描画
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
//描画処理を実行
glFlush();
//ダブルバッファ(描画バッファと表示バッファ)入れ替え
SwapBuffers(hDC);</code></pre>
ソースコード
以前公開していたものは、3Dプログラムとタイトルに書いておきながらポリゴン(2D)の表示のみだったので、テクスチャを貼った3Dポリゴンを描画するようにしました。
ブログで公開していたソースコード
そのままです。VS2022でビルド&実行できることを確認済み
この記事が役に立ったという方は、サポートお願いします。今後の製作の励みになります。