さて、この間こんなことを書きました。

 

Visual Studio探検記】は一応完結させましたが、折角Visual StudioのIDE環境を持てたので、もう少しこれで遊んでみようかな?と考えています。

 

その「」でこんなことも書きました。

 

:2年前にOpenGLに興味を持ち、(既にC++のglut<freeglurt>で始めていましたが)初めて知ったC#用のOpenGLライブラリーであるOpenTK、導入からその二つの実装方法(GLControlとGameWindow)を使ったサンプルまで、既に「C#、.NETFramework 4.8、WinForms、(非常に苦労して集めた)OpenTK 3.3.3 という環境で、いくつかのプリミティブ(基本図形を使う3Dグラフィックライブラリー(OpenTK_Primives)までまとめましたが、当時「OpenTK 4.*以降は.NETFrameworkとWinFormsでは扱えなかった」ことを思い出し、「Visual Studioがあれば使えるかな?」と考えました。

 

ということで、

 

物は試し、早速最新のOpenTK(4.9.4)を取り入れて()、まずはいくつかの物体表示ができる自作ライブラリー(OpenTK_Primives)を使えるようにビルドを試みたのですが、

 

エラーの嵐!

MSCompAssの場合はまずDLLを探してきて、それを参照して"using"文で名前空間を特定する、ということが必要でしたが、Visual Studioでは極めて簡単です。

(1)ソリューションエクスプローラーで対象のプロジェクトを選択、右クリックして「NuGetパッケージの管理」を選択

(2)NuGetパッケージマネージャーの画面が表示されるので、「参照」タブをクリックして、検索用のテキストボックスに必要とするライブラリ名(例:"OpenTK")を入力して検索します。

(3)一覧が表示されるので、ライブラリをクリックして選択し、「インストール」ボタンを押します。 

 

理由を確かめるべく、Copilot君に質問を行います。以下はそのやり取り。

 

【Session 1】
Q: 今度はC# .NET10 WinFormsで最新のOpenTK4.9.4が使えるのか確認願います。 .Net Framework 4.8で完動するプログラムをビルドすると


型または名前空間の名前 'Vector3d' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)
引数 1: は 'System.Numerics.Vector3' から 'byte[]' へ変換することはできません
 

というエラーが出ます。現在の参照名前空間は、
 

using System; using OpenTK;    //OpenTKを使用する際に必須
using OpenTK.Graphics;        //OpenTKのグラフィックを使用する際に必須
using OpenTK.Graphics.OpenGL;    //OpenGLを使用する際に必要

です。


A: ここがまさに OpenTK 3.x と 4.x の最大の違いが表面化するポイントです。あなたが書いている using 群は OpenTK 3.x 時代の構成で、OpenTK 4.9.4 ではそのまま使えません。
(略)


🧭 OpenTK 4.9.4 の正しい using 構成
OpenTK 4.x では次のように書きます:
using OpenTK.Windowing.Common;
using OpenTK.Windowing.Desktop;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics;

ポイント:
- GLControl は別パッケージ(OpenTK.GLControl)
- 数学型は OpenTK.Mathematics に統合
- OpenGL は OpenGL4 名前空間に統一
- GameWindow / NativeWindow は Windowing.Desktop に移動

まとめ
あなたの現在の using 群は OpenTK 3.x 専用であり、OpenTK 4.9.4(.NET10対応)では↑のように書き換える必要があります:


Q: using文を教えていただいたOpenTK 4.*のものと交換しただけで、以下の自作ライブラリー(解説:OpenTK_Primitivesのコードは省略)はビルドできました。
しかし、このライブラリーとOpenTKのGameWindowで動いたプログラムに以下のエラーが出ています。using文と同じく、GameWindowもOpenTK 3*から大きく変わったのでしょうか?


'Box2i' に 'Height' の定義が含まれておらず、型 'Box2i' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Height' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください
'Box2i' に 'Width' の定義が含まれておらず、型 'Box2i' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Width' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください
'Box2i' に 'X' の定義が含まれておらず、型 'Box2i' の最初の引数を受け付けるアクセス可能な拡張メソッド 'X' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください
'Box2i' に 'Y' の定義が含まれておらず、型 'Box2i' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Y' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください
'EnableCap' に 'Light0' の定義がありません
'EnableCap' に 'Lighting' の定義がありません
'GameWindow' には、引数 4 を指定するコンストラクターは含まれていません
'GL' に 'Light' の定義がありません
'GL' に 'LoadMatrix' の定義がありません
'GL' に 'MatrixMode' の定義がありません
'GL' に 'PopMatrix' の定義がありません
'GL' に 'PushMatrix' の定義がありません
'GL' に 'Rotate' の定義がありません
'gWindow' に 'KeyPress' の定義が含まれておらず、型 'gWindow' の最初の引数を受け付けるアクセス可能な拡張メソッド 'KeyPress' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください
'gWindow.OnLoad(EventArgs)': オーバーライドする適切なメソッドが見つかりませんでした
'Keyboard' に 'GetState' の定義がありません
'MatrixMode' に 'Modelview' の定義がありません
'MatrixMode' に 'Projection' の定義がありません
デリゲート 'Action<KeyboardKeyEventArgs>' に一致する 'gW_KeyDown' のオーバーロードはありません
デリゲート 'Action<KeyboardKeyEventArgs>' に一致する 'gW_KeyUp' のオーバーロードはありません
デリゲート 'Action<MouseButtonEventArgs>' に一致する 'gW_MouseDown' のオーバーロードはありません
デリゲート 'Action<MouseMoveEventArgs>' に一致する 'gW_MouseMove' のオーバーロードはありません
メタデータ ファイル 'C:\Users\ysama\source\repos\OpenTK\OpenTK_Primitives\obj\Release\net10.0\ref\OpenTK_Primitives.dll' が見つかりませんでした
型または名前空間の名前 'OTKPrims' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)
型または名前空間の名前 'Vector3d' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)
引数 1 を指定するメソッド 'OnLoad' のオーバーロードはありません
引数 1: は 'System.EventArgs' から 'OpenTK.Windowing.Common.ResizeEventArgs' へ変換することはできません
引数 1: は 'System.Numerics.Vector3' から 'byte[]' へ変換することはできません
現在のコンテキストに 'Color4' という名前は存在しません
現在のコンテキストに 'Exit' という名前は存在しません
現在のコンテキストに 'GraphicsMode' という名前は存在しません
現在のコンテキストに 'Height' という名前は存在しません 現在のコンテキストに 'Key' という名前は存在しません
現在のコンテキストに 'Width' という名前は存在しません


A: (私の名)、これはまさに OpenTK 3.x → 4.x 移行で最も破壊的な部分に突入した証拠です。あなたのプリミティブ描画ライブラリは「Immediate Mode だけ」だったので奇跡的に動きましたが、GameWindow は OpenTK 4.x で完全に別物になりました。あなたが列挙したエラーは、すべて OpenTK 3.x の API が OpenTK 4.x では削除・変更されたために起きています。ここで、何がどう変わったのかを体系的に整理します。

🔥 結論:OpenTK 4.x の GameWindow は 3.x と別物
OpenTK 4.x の GameWindow は Windowing.Desktop.GameWindow に置き換わり、イベント、コンストラクタ、入力、OpenGL API、行列操作、ライト、固定機能パイプラインがすべて変更されています。あなたのエラーは、ほぼすべて OpenTK 3.x 固定機能パイプライン + 旧 GameWindow API に依存しているためです。
(略)


🧭 ではどうすればいいのか?
あなたの選択肢は 3つあります。

✅ 選択肢 1:OpenTK 3.x を使い続ける(最も簡単
ー解説:しかし、これらは既に出来上がっているのでやる意味がないです。
GameWindow を含む既存コードがそのまま動く。
- .NET Framework 4.8 → OK
- .NET 10 → OpenTK 3.x も動く(ただし非推奨)
あなたの目的が「OpenGL Immediate Mode で図形を描く」なら、OpenTK 3.x のままが最も合理的です。

✅ 選択肢 2:OpenTK 4.x に完全移行(
大改造が必要
GameWindow の書き換えは ほぼ全面改修になります。
- 行列 → 自前で Matrix4 を使う
- ライティング → シェーダーで実装
- 入力 → KeyboardState / MouseState に書き換え
- GameWindow → 新 API に書き換え
あなたのコード量だと、1〜2日では終わらないレベルです。(
解説:本当にOpenTK 4.*をやりたいなら、これだったのですね、今思えば。

✅ 選択肢 3:WinForms + GLControl(OpenTK 4.x)で続行
あなたのプリミティブライブラリは WinForms + GLControl で動くので、GameWindow を捨てて WinForms だけで完結させる方法もあります。これは実はかなり現実的です。(
解説:この時このオプションはとても魅力的でした。

🎯 (私の名) への最適解(あなたのスタイルを踏まえて)
あなたの哲学は:
- 「Lean and Mean」
- 「必要以上に複雑なものは採用しない」
- 「Immediate Mode で十分ならそれでいい」
これを踏まえると、最も合理的なのは:

⭐ OpenTK 3.x の GameWindow を使い続ける
または
OpenTK 4.x でも WinForms + GLControl に統一する

 

GameWindow を 4.x に移行するのは、あなたの目的(図形描画)に対して コストが高すぎる。
(略)


Q: その前にCopilot君に私の「意図(生成系AIでも持たないんでしょ?)」を伝えておくべきかと思います。


1.まず、このエラーだらけのプログラムは私が.NET Framework 4.8+WinForms+OpenTK(3..3→これをネットで探すのに苦労しました)で既に完成(完動)させているものなので、「Visual Studioベース」でこのプログラムを動かすこと自体に未練はありません。

2.「Visual Studioベース」でOpenTKを使いたいのは、まずOpenTKの最新版(4.*)について学習することと、OpenTK_Primitives.dll(これはビルドできましたが、GameWindowでは使えず、GL_Controlなら使える(?)ということですか?)を使えるようにしたい(4.*ベースに改造したり、その為のライブラリーにしたい)、ということです。

3.最終的な目標は、OpenTKを最新の4.*ベース、OpenTK_Primitivesで使えるようにして、(これも.NETFramework 4.8で作った迷路作成、彷徨プログラムである)"Maze"に使いたいと考えています。
 

私自身の考え方としては、必ずしもGameWIndowにこだわらないので、GLControlベースで過去資産が使えるならば生かしたいと考えており、オプションの「OpenTK 4.x でも WinForms + GLControl に統一する」で問題ありません。(実際同じテストプログラムを3.3のGameWindowとGLControlの両方で動くようにしていますので。)

(解説:↓がOpenTK 3.3.3 GLControlベースの完動するテストプログラムです。)



A: (私の名)、あなたの「意図」は完全に理解できました。むしろ、ここまで明確に整理されているからこそ、最適な道筋がはっきり見えてきます。あなたの目的は 「OpenTK 4.x を学びつつ、過去資産(OpenTK_Primitives)を最大限活かし、最終的に Maze に統合する」 であり、GameWindow に固執する必要はないということですね。この前提に立つと、あなたにとって最も合理的で、最も「Lean and Mean」な道はひとつです。

🎯 あなたの意図を整理するとこうなる
① Visual Studio で OpenTK 3.3 の GameWindow を動かす必要はもう無い
→ これは「過去の完成品」であり、学習目的ではない。
② Visual Studio で OpenTK 4.x を学びたい
→ これは「未来のための投資」。
③ OpenTK_Primitives.dll を 4.x ベースで使えるようにしたい
→ すでにビルドできているので、GLControl ならそのまま使える。
④ 最終的には Maze(過去資産)を OpenTK 4.x で動かしたい
→ つまり「OpenTK 4.x で WinForms + GLControl を使う」ことが最短ルート。

⭐ 結論:あなたの選択は完全に正しい
OpenTK 4.x では GameWindow を捨てて、WinForms + GLControl に統一する。これはあなたの目的に対して最も合理的で、最もコストが低く、最も未来に繋がる選択です。理由は以下の通り。

🧠 なぜ GameWindow を捨てるべきなのか
GameWindow(OpenTK 4.x)は 3.x と完全に別物
- イベントモデルが違う
- 入力が違う
- コンストラクタが違う
- 行列管理が違う
- 固定機能パイプラインが使えない
- Immediate Mode は動くが、周辺 API が壊滅的に変わっている
つまり、あなたの過去資産(Maze、Primitives)を GameWindow 4.x に移植するのは非合理

🧠 なぜ GLControl が最適なのか
GLControl は「OpenGL のコンテキストだけを提供する」
つまり、あなたの Immediate Mode ベースの描画コードは そのまま動く。
- GL.Begin
- GL.Vertex3
- GL.Normal3
- GL.End
- GL.PushMatrix / GL.PopMatrix
- GL.Rotate / GL.Translate
これらは OpenTK 4.x でも互換 API として残っている。GameWindow では削除された API が、GLControl では普通に使える。これはあなたの資産にとって非常に大きい。

🧠 なぜ OpenTK_Primitives.dll は GLControl なら動くのか
あなたのライブラリは:
- Immediate Mode のみ
- 固定機能パイプラインの一部(MatrixMode など)を使用
- OpenGL のコンテキストさえあれば動く
GLControl は OpenGL コンテキストを提供するだけなので、
GameWindow のような API 変更の影響を受けません。だから OpenTK 4.x + GLControl でそのまま動く。
(略)

 

どうでしょう?

 

最初のOpenTK_Primitivesのエラーは(まぁ、"using"文の名前空間は違うのだろうなとは思っていたので)、簡単に乗り越えられましたが、GameWindowベースのプログラムが膨大なエラーで埋め尽くされた時には、「ここで撤退しようか?」と真剣に考えました。

 

しかし、Copilot君の

 

OpenTK 4.x で WinForms + GLControl を使う

あなたの Immediate Mode ベースの描画コードは そのまま動く

だから OpenTK 4.x + GLControl でそのまま動く

 

という力強い応援で勇気づけられ、

 

「よしっ、いったれ!」

 

という気合が入りました ........が ........(次回に続く)