に、既にobsolescence(陳腐化)の域に入り込んでいるともいえるOpenGLに突如関心をもった話を書きました。その理由は、単に「ブログを書くために、C++のIDEの調査の為ダウンロードしたDev-C++のサンプルにあったWin32 SDKのプログラム」

(↑haOpenGLのサンプルを基に自作した"GL Sampler")

がOpenGL(但し、そのサンプルは2Dグラフィック)だったから、なんですが。

 

で、

やろうかとおもってwebをググってゆくと、この世界はCGの世界につながっていて

気が遠くなるように広いぃぃぃぃ...

 

これは「脳みそが爆発するか、この世に帰ってこれなくなるぞ」と思い、2D5つ、3D5つくらいのサンプルを表示する"GL Sampler"を作って、手をパンパン、「おつかれっしたぁー」にしようと思ったのですが...

 

(1)先ず、私のC++開発環境は旧Borlandの承継会社Embarcaderoがフリーで配布しているC++コンパイラー("BCC102"のbcc32c.exe)であり、bcc32c.exeでもコンパイルできた問題のサンプルを眺め、webをググって、WindowsのOpenGLがVersion 1.1で、gl.hとglu.hをインクルードするだけで使えることが分かりました。(因みに↑の2Dのデモはこのレベルで対応できます。)

 

(2)ただし、↑のサンプルなどWin32APIのGDIでできちゃうので、「OpenGLをしゃぶる」には3DのCGをしなくてはなりませぬ!しかし、それには結構ハードルが高いし、関連サイトを見ているとヘッダーファイルにない"glut.h"をインクルードして何やら楽しそうなことをやっています。

ん、んんん、んんんんんん、GLUTって何?

というところでドツボへの第一歩を踏み出しました。

 

(3)glutというのはOpenGL Ulitity Toolkitの略だそうで、既に先人が「なんと、オープンで!!!」OpenGL用のライブラリーを作ってくれていたようです。

そんじゃ、遠慮なく、ごっそさんでーす!

となるはずだったのですが...

 

(4)Webでは何やらglutはVersion 3.7で1998年から更新されていない、バグっぽい所もある等の話がwebにあり、(後光の指しているボランティアの方がしこしこと継承して)その後継のfreeglutがあるらしいことが分かりました。しかし読んでみると、これはソースレベルで提供されており、DLLやlibはCMakeというMakeユーティリティでコンパイルしなければならない、Embarcadero C++にはVisual Studioベースにコンパイルしてから改造しなければならない、等の話で、

あーヤメヤメ止めっ!

となりました。

 

(5)でも、だれか、なんかあるだろう?というセコさで調査を継続し、とうとう、GLUT for Win32のWeb ページから最新のWindows VC++用precompiledファイル glut-3.7.6-bin.zip がダウンロードできるというところまで調べました。(注)
注:GLUTfreeGLUTを利用するには、フルサイズの圧縮ファイルをダウンロードしてコンパイルする必要があり、ちょっと遊ぶだけの私の場合は、必要なファイルだけダウンロードすればいいや、と思っていました。

 

(6)ダウンロードしたファイルのうち、GLUTのライブラリー(glut32.lib)は、Microsoft Visual C++用(COFF形式)なので、次のようにBCC用のライブラリ(OMF形式)を作成しなければなりません。これはBCC102のbinフォールダーにあるimplib.exeを使えばよいのです。(PoweShellは同じフォールダーのコマンドでも".\"が必要)
.\implib glut32.lib glut32.dll(Enter)
後はOMF用のライブラリー元のライブラリーファイルと入れ替えます。

そして最後に以下の3ファイルを所定のフォールダーにコピーします。(以下は私の場合)
(1)glut32.dllをC:\Windows\SysWOW64へ(System32ではないので注意!
(2)glut.hをC:\Borland\BCC102\Inlcude\gl
(3)glut32.libをC:\Borland\BCC102\lib\win32c\release\psdk
もちろんbcc32c.exeの初期設定ファイル(bcc32c.cfg)に
-L@\..\lib\win32c\release\psdk
というパスが通っているか確認します。

 

(7)最初、"exit"関数のglut.hとstdlib.hによる二重定義エラーがでて、最初の往生がありましたが、それは新しいglut.hをご本家のダウンロードファイルからとってきて交換することで何とか乗り越えられ、その後は(当たり前ですが)glutのサンプルプログラムが3Dも含めて一応使えるようになりました。

しかし冒頭の自作"GL Sampler"で3Dサンプルを表示させようとすると何も表示しません。これは色々とチェックし、色々と調べCopilotやChatGPTにも縋って点検しましたが、何が問題であるか分かりませんでした。

で、これはglut(glut32.dll)が旧い、旧すぎるんじゃないか?

と疑ったわけです。

 

(8)ここまで来ると病膏肓。

新しいfreegluを導入しよう、絶対!

という妄信となり、さらに調査してfreeglut Windows Development LibrariesというところのDownload freeglut 3.0.0 for MSVCdでVC++用のプリコンパイル版をゲット!

↑のと同じように、

(1)freeglut.dllをC:\Windows\SysWOW64へ(同じファイルをgult32.dllとしても登録)
(2)glut.hとfreeglut*.hすべてをC:\Borland\BCC102\Inlcude\glへ
(3)freeglut.dllからimplib.exeで作ったfreeglut.libとglut32.libをC:\Borland\BCC102\lib\win32c\release\psdkへ
ファイルを配置し、いざコンパイル!

所が、ところが、

今度はリンカーエラーが大量に発生します。glutのサンプルプログラムだけでも、

Error: Unresolved external '__glutInitWithExit' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT001-291191.O
Error: Unresolved external '__glutCreateWindowWithExit' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT001-291191.O
Error: Unresolved external 'glutDisplayFunc' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT001-291191.O
Error: Unresolved external 'glutMainLoop' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT001-291191.O
Error: Unresolved external 'glutInitWindowPosition' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT002-034016.O
Error: Unresolved external 'glutInitWindowSize' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT002-034016.O
Error: Unresolved external 'glutInitDisplayMode' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT002-034016.O
Error: Unresolved external 'glutReshapeFunc' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT003-379084.O
Error: Unresolved external 'glutPostRedisplay' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT005-452307.O
Error: Unresolved external 'glutKeyboardFunc' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\TESTGLUT005-452307.O

こんなに発生し、基本的なglutMainLoop等の関数まで参照できずにいます。

この為、何度もlibファイルをチェックし、登録されていることを確認し、libファイルの置き場所を変えたりしましたが、依然エラーは解消できず、

結局
ソースコードにlibファイル指定の#pragma comment(lib, "freeglut")をいれて参照を強制せざるを得ませんでした。

でも、glut32.libは参照するのに、freeglut.libは参照しない、

なんでなんだろう?

分からん。

 

(9)ここまで来ると、もう意地というかなんというか、

絶対に解決してやるという根性

だけです。この#progma文のおかげで、エラーが出ていたサンプルプログラムがコンパイルできるようになり、とうとうGLUTのサンプルプログラムで(実はこれがやりたかったのですが)

WireTeapotを表示することが出来ました。

そして、

いよいよ自作の"GL Sampler"でTeapotを表示しようとしたら、

ストン、と落ちてしまう(プログラムが異常終了すること)

じゃないですか!

何故なんだーっ!

と空しく叫ぶだけの老人(今年古希)でした。

 

ps. 絶対にりべんじしてやる!