はじめに

VisualBasicでOpenGLプログラミングをするにはタイプライブラリが必要です.さらにアプリケーションとして配布するときにはこのタイプライブラリを同梱する必要があります.
筆者はVisualBasic6.0を使用していますが,OpenGLのタイプライブラリはこれに含まれていました.
それと私自身あまりVisualBasicに詳しくないので細かいことには触れません.(触れられませんw)
まず,新規作成で新しいプロジェクトを選択,標準EXEを作成します.できあがったプロジェクトのFirm1に対してコーディングしていきます.

初期化

 
レンダリングコンテキストを保持する変数はグローバル変数として宣言します.
初期化,リサイズ,描画,破棄を処理するために,FormにInitialize,Resize,Unload,Paintを追加します.まずForm_Initializeに初期化処理をコーディングします.

Private Sub Form_Initialize()
'初期化作業
'GLウィンドウの作成
If CreateGLWindow = False Then
Call KillGLWindow
End
End If
'OpenGLの命令設定
Call InitGL
End Sub

これが初期化初期化処理になります.
まずCreateGLWindowでピクセルフォーマットを設定し,レンダリングコンテキストを作成しています.CreateGLWindowの中身は以下のようになっています.

Public Function CreateGLWindow() As Boolean
Dim PixelFormat As GLuint
Dim pfd As PIXELFORMATDESCRIPTOR    'ピクセルフォーマット構造体
With pfd
.cColorBits = 16    'カラーバッファ16ビット
.cDepthBits = 16    'デプスバッファ16ビット
.dwFlags =
PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or PFD_DOUBLEBUFFER
'ウィンドウスタイル
.iLayerType = PFD_MAIN_PLANE
.iPixelType = PFD_TYPE_RGBA
'カラータイプ
.nVersion = 1       'OpenGLのバージョン
End With
mainForm.ScaleMode = vbPixels
PixelFormat = ChoosePixelFormat(mainForm.hDC, pfd)
If PixelFormat = 0 Then         'ピクセルフォーマットの選定に失敗
Call KillGLWindow           'ウィンドウ破棄
MsgBox "ピクセルフォーマット選択失敗", vbExclamation, "警告"
CreateGLWindow = False      '戻り値
Exit Function
End If
If SetPixelFormat(mainForm.hDC, PixelFormat, pfd) = 0 Then
'ピクセルフォーマットの設定に失敗
Call KillGLWindow                       'ウィンドウ破棄
MsgBox "ピクセルフォーマット設定失敗", vbExclamation, "警告"
CreateGLWindow = False                  '戻り値
Exit Function
End If
hRC = wglCreateContext(mainForm.hDC)
If (hRC = 0) Then                'レンダリングコンテキストの作成に失敗
Call KillGLWindow            'ウィンドウ破棄
MsgBox "レンダリングコンテキスト作成失敗", vbExclamation, "警告"
CreateGLWindow = False       '戻り値
Exit Function
End If
'レンダリングコンテキストをカレントコンテキストに設定
If wglMakeCurrent(mainForm.hDC, hRC) = 0 Then
Call KillGLWindow
MsgBox "コンテキストの設定失敗", vbExclamation, "警告"
CreateGLWindow = False
Exit Function
End If
'初期化成功
CreateGLWindow = True
End Function

処理の流れは,やはり他のC/C++と同じでピクセルフォーマット構造体に設定値を書き込み,それをもとにレンダリングコンテキストを作成,そして,デバイスコンテキストにFormが持つレンダリングコンテキストを結び付けます.
InitGLでは,glClearColorなどのOpenGLの初期化コマンドを実行しています.

リサイズ

リサイズ処理はウィンドウが作成されたときに必ず呼び出されます.
リサイズ処理では,Viewportの設定,射影変換の設定を行います.

Height = mainForm.ScaleHeight
If Height = 0 Then
Height = 1
End If
'ビューポートの設定
glViewport 0, 0, mainForm.ScaleWidth, Height
glMatrixMode mmProjection   'プロジェクションマトリクスモードへ移行
glLoadIdentity              'プロジェクションマトリクスを単位行列にリセット
'ウィンドウのアスペクト比を算出し、アスペクト比を代入する
gluPerspective 45#, mainForm.ScaleWidth / Height, 0.1, 100#
glMatrixMode mmModelView    'モデルビューモードへ移行
glLoadIdentity
'リサイズ時に再描画
Call DrawGLScene
SwapBuffers mainForm.hDC

まず初めにウィンドウの高さが0になるとDevide By Zeroエラーがでるので,その回避処理を行っています.次にViewportを設定し,射影変換を行い,描画コードであるDrawGLSceneを呼び出し再描画を行っています.

描画コード

描画コードは,別にDrawGLScene内に記述し,Form_Paintから呼び出す形式になっています.実際の描画コードはこのようになっています.

Public Function DrawGLScene()
'描画関数
'描画コードはここに記述します
'カラーバッファとデプスバッファのクリア
glClear clrColorBufferBit Or clrDepthBufferBit
glLoadIdentity
gluLookAt 0, 0, 4, 0, 0, 0, 0, 1, 0
'四角形の描画コード
glBegin bmTriangles
glColor3f 1, 0, 0
glVertex3f 0#, 1#, 0#
glColor3f 0, 1, 0
glVertex3f -1#, 0#, 0#
glColor3f 0, 0, 1
glVertex3f 1#, 0#, 0#
glEnd
End Function

OpenGLの解放

OpeGLの開放はForm_Unloadで行います.Form_Unload内でKillGLWindowを呼び出し,OpenGLの開放を行っています.

Public Sub KillGLWindow()
'OpenGLで使用したレンダリングコンテキストの破棄
If hRC Then                      'レンダリングコンテキストの有無の確認
If wglMakeCurrent(0, 0) = 0 Then   'レンダリングコンテキストの確認
MsgBox "コンテキスト破棄失敗", vbInformation, "警告"
End If
If wglDeleteContext(hRC) = 0 Then  'レンダリングコンテキストの破棄
MsgBox "レンダリングコンテキスト破棄失敗", vbInformation, "警告"
End If
hRC = 0
End If
End Sub

http://code.google.com/p/sonson-code/source/browse/#svn/trunk/gl/simple_vb