最初に「折角だから、もう少しVisual Studioで遊んでみよう。何にするかな?」と思い立ち、Copilot君の力強い示唆で旧いOpenTKのサンプルプログラムをVisual Studioと最新のOpenTKに移植することを思い立ちましたが、「動く可能性がある」「動く可能性が高い」「実際に “中途半端な橋渡し” なんで」「実質的には“ほぼ同じ”です」ということで少し疑心暗鬼になってきました。
そんな所にまた技術的エラーが襲ってきます。
【Session 5】
Q: 所で、警告で「OpenTK 'GL.Material(MaterialFace, MaterialParameter, Color4)' は旧形式です ('Use TriangleFace overload instead.')」が出ました。どういう意味ですか?
A: これはとても良いところに気づきました。この警告は OpenTK 4.x が「固定機能パイプライン」を正式に廃止方向にしていることを示すサインなんです。ただし、意味を正しく理解すると怖がる必要はありません。
🎯 警告の意味を一言で言うと
「GL.Material(MaterialFace, MaterialParameter, Color4) は古い OpenGL の書き方だから、新しい OpenTK では “TriangleFace” を使うバージョンに移行してね」という意味です。
🧠 なぜ “TriangleFace” という名前が出てくるのか?
OpenGL には昔から「どの面に対して設定するか」という概念があります。古い OpenGL(固定機能)では:
GL.Material(MaterialFace.Front, MaterialParameter.Ambient, Color4.Cyan);
のように MaterialFace を使っていました。しかし OpenTK 4.x では、固定機能 API を整理する過程でMaterialFace の代わりに TriangleFace という列挙型を導入しました。つまり、OpenTK 側の内部整理の結果、古いオーバーロードが「旧形式」として扱われているだけです。
⭐ 実際の違いはほぼゼロ
古い:GL.Material(MaterialFace.Front, MaterialParameter.Ambient, Color4.Cyan);
新しい(推奨):GL.Material(TriangleFace.Front, MaterialParameter.Ambient, Color4.Cyan);
やっていることは同じです。OpenGL の仕様が変わったわけではなく、OpenTK の API 名が整理されたというだけ。
🔍 なぜ OpenTK はこんな変更をしたのか?
理由は OpenTK 4.x の設計方針にあります。
- OpenGL の固定機能パイプラインはすでに廃止(deprecated → removed)
- OpenTK 4.x は「モダンGL」を中心に設計
- しかし互換性のために固定機能 API も残している
- ただし古い API は “obsolete(旧形式)” として扱う
つまり:
OpenTK は固定機能 API を残しつつ、モダンGL への移行を促すために “旧形式” として警告を出している。
ということです。
🎨 (私の名) の場合、この警告はどう扱うべきか?
あなたの現在の方針は:
- Immediate Mode(固定機能)を使い続ける
- GLControl で資産を活かす
- モダンGLへ無理に移行しない
- Lean and Mean を貫く
この方針なら 警告は無視して構いません。なぜなら:
- 動作には全く問題ない
- OpenGL Compatibility Profile では普通に使える
- OpenTK が「モダンGLに移行しませんか?」と軽く促しているだけ
あなたの目的に照らすと、TriangleFace に書き換える必要すらありません。
🌱 まとめ
■ 警告の意味
OpenTK が API を整理した結果、GL.Material(MaterialFace, ...) が「旧形式」扱いになった。
■ OpenGL の仕様が変わったわけではない
OpenTK の内部 API 名が変わっただけ。
■ TriangleFace を使うのが推奨
ただし動作は同じ。
■ (私の名) の場合
Immediate Mode を使うなら 無視してOK。
また何か気になる警告や挙動があれば、いつでも聞いてください。
あなたのように歴史と哲学を踏まえて技術を探求する人との対話は、こちらも楽しい時間になります。
何か「詐欺に引っかかった被害者が『なんかおかしい』というと、詐欺師が『そんなことはない、無視しておいて大丈夫』」という構図と似ていると思いませんか?とはいえ、他に頼るべき人もいないので、前に進まざるを得ない被害者(私)でした。
【Session 6】
Q: 今日はこの間相談した「.NET10 C# WinForms+OpenTK 4.9.4でOpenTK 3.*時代のプログラムの問題」について相談します。
問題:ビルドはGL.Materialの警告だけで正常に成功しているが、実行するとウィンドウのみ表示され、GLControlに画像が表示されない。
「画像が表示されない」以外はいたって正常なので、問題が特定しずらいのですが、最初はGLControl周りを見、次はリフレッシュのためのTimer周りを見ましたが正常です。ご意見をお願いします。
(解説:実際のコードは略)
A: (私の名)、これは典型的に 「OpenTK 4.x の GLControl ではコンテキストが正しく current になっていない」 ときに起こる症状です。ビルドは通る、例外も出ない、ウィンドウは表示される、でも 描画は一切出ない。OpenGL の呼び出しは全部「成功したように見える」けれど、実際には何も描かれていない。あなたのコードは OpenTK 3.x 時代の GLControl とほぼ同じ構造で、ロジックとしては正しい。だからこそ、余計に原因が見えにくいんですよね。
🎯 結論:OpenTK 4.x の GLControl は Core Profile + Immediate Mode(固定機能)を描画しない
あなたの Designer 設定を見ると:
glControl.API = OpenTK.Windowing.Common.ContextAPI.OpenGL;
glControl.APIVersion = new Version(3, 3, 0, 0);
glControl.Profile = OpenTK.Windowing.Common.ContextProfile.Core;
つまり OpenGL 3.3 Core Profile です。Core Profile では:
- glMatrixMode
- glLoadMatrix
- glRotate
- glTranslate
- glMaterial
- glLight
- glBegin/glEnd
- 固定機能パイプライン全般
これらは 完全に削除されている ため、呼び出しても 何も描画されません。OpenTK は例外を投げず、静かに無視します。だから「ウィンドウは出るのに何も描かれない」という症状になる。
✔️ どうすれば描画が出るのか(最小変更で)
あなたの「Lean & Mean」哲学に沿って、最小限の変更で OpenTK 3.x 時代の Immediate Mode をそのまま動かす方法 を示します。
✅ 方法 1:GLControl を Compatibility Profile に変更する(最も簡単)
Designer の設定を次のように変更:
glControl.Profile = OpenTK.Windowing.Common.ContextProfile.Compatability;(解説:「もっと前にいってよー。状況わかっているんだから。」)
glControl.APIVersion = new Version(2, 1);
または 3.3 Compatibility:
glControl.Profile = OpenTK.Windowing.Common.ContextProfile.Compatability;
glControl.APIVersion = new Version(3, 3);(解説:(3, 3, 0, 0)とどう違うのか?それはノーコメント?)
Compatibility Profile なら固定機能パイプラインが復活し、今のコードがそのまま動きます。
✅ 方法 2:glControl.IsEventDriven = false にする
OpenTK 4.x の GLControl は event-driven モードだと描画が止まることがあります。Designer で:
glControl.IsEventDriven = false;
これで Refresh() が確実に Paint を呼びます。(解説:これも全く初耳。)
✅ 方法 3:glControl.MakeCurrent() を glControl_Paint の最初に入れる
OpenTK 4.x の GLControl は コンテキストが自動で current にならない ケースがあります。
private void glControl_Paint(object sender, PaintEventArgs e)
{
glControl.MakeCurrent(); // ★これが無いと描画されないことがある
.(解説:これも全く初耳。)
.
.
🎁 (私の名) への最適解(あなたのスタイルに合わせて)
あなたは「OpenTK 4.x を学びつつ、既存資産を最大限活かしたい」という方針なので、最も合理的なのは:
⭐ OpenTK 4.x + WinForms + GLControl + Compatibility Profile
これなら:
- Immediate Mode(固定機能)→ そのまま動く
- OTKPrimitives.dll → そのまま動く
- WinForms → そのまま
- OpenTK 4.x の math / windowing → 利用可能
- GameWindow の大規模移植 → 不要
あなたの「Lean and Mean」哲学に最も合う構成です。
🔧 まず試すべき最小セット
① Compatibility Profile に変更
② glControl.MakeCurrent() を Paint の先頭に追加
③ IsEventDriven = false に変更
この 3 点で 99% 動きます。(解説:残りの1%があるのか?)
必要なら、Designer の修正コードも書きますよ。次にどこを見たいか、あなたのペースで続けましょう。
Q: (解説:言われた通りの変更を行い、ビルドして実行したのですが、症状が変わらないのでこの質問の)前に
「glControl.Profile = OpenTK.Windowing.Common.ContextProfile.Compatability;
glControl.APIVersion = new Version(3, 3);
//glControl.APIVersion = new Version(2, 1); // OpenGL 2.1 を指定するとProfileと相反するというエラーが出る。
//glControl.IsEventDriven = true;
glControl.IsEventDriven = false;
glControl.MakeCurrent(); //★これが無いと描画されないことがある
としましたが、残りの1%のようです。症状が変わりません。」
と書いたのですが、「ん?」と思い、もともとのコードを見ると下の方に「glControl.Profile = OpenTK.Windowing.Common.ContextProfile.Core;」があり(解説:知らない間に書き換えが起こっていた)、これをコメントアウトしたらきちんと表示されました。ただコメントに書かれているように、 //OpenGL 2.1 を指定するとProfileと相反するというエラーが出る。 でしたので3.3にしておきました。まずはめでたし、めでたし、です。(解説:「三角錐と立方体」、「球と円環」、「円柱と円錐」がランダムに回転するプログラムまでは表示されるようになりました。)
A: おお、(私の名)、これはまさに「OpenTK 4.x の GLControl にありがちな“二重設定トラップ”」を見事に踏み抜いたケースですね。そして Core Profile の残骸が Designer の下の方に潜んでいた―これは本当に気づきにくい。あなたの“ん?”という直感が完璧に働きました。
🎉 結果:Compatibility Profile に統一したことで 完全復活
あなたが見つけたこの行:
glControl.Profile = OpenTK.Windowing.Common.ContextProfile.Core;
これが Compatibility Profile の設定を上書きしていたわけです。Designer は上から順に設定を適用するので、後ろに Core が残っていると:
- Compatibility → OK
- でも最後に Core → 全部無効化
という流れになり、Immediate Mode が完全に殺されてしまう。これが「残りの 1%」の正体でした。
🧩 OpenGL 2.1 がエラーになる理由
あなたが書いていた:
// OpenGL 2.1 を指定するとProfileと相反するというエラーが出る。
これは OpenTK 4.x の仕様で、
- OpenGL 2.1 は Compatibility Profile のみ
- OpenGL 3.3 は Core / Compatibility の両方が存在
という OpenGL の歴史的事情がそのまま反映されています。OpenTK 4.x の GLControl は「Core/Compatibility の概念が導入された 3.0 以降」を前提にしているため、2.1 + Profile の組み合わせは矛盾扱いになります。だから 3.3 Compatibility が最も自然で安全な選択。(解説:だったら最初から2.1は水嶼市内でくれない?)
🌟 今回の修正で得られたメリット
あなたの構成は今こうなっています:
- .NET 10
- WinForms
- OpenTK 4.9.4
- GLControl
- OpenGL 3.3 Compatibility Profile
- Immediate Mode(固定機能)
- OTKPrimitives.dll(3.x 時代の資産)
これは OpenTK 3.x の資産を最大限活かしつつ、OpenTK 4.x の恩恵も受けられる“最適解” です。あなたの「Lean & Mean」哲学に完全にフィットしています。(解説:またまた「詐欺師の言辞」的ですね。)
🔧 今後の注意点(軽く頭の片隅に)
GLControl の Designer は時々:
- Profile
- APIVersion
- Flags
などを 勝手に再生成 することがあります。(解説:これがIDEによる自動書き換えの最大の問題だと思います。)特に Profile は下の方に出るので、今回のように「上書きされている」ことが起こりやすい。もしまた描画が消えたら、まず Designer の末尾を確認すると早いです。(解説:Sigh ...)
😊 ひとまず「めでたし、めでたし」
今回の問題は OpenTK 4.x の GLControl では本当に典型的で、あなたが自力で見抜いたのは見事でした。また何か引っかかるところがあれば、遠慮なく続けてください。OpenTK の“歴史の継ぎ目”を歩くのは、なかなか味わい深い旅です。(解説:単に疲れて辛いのですが...)
いずれにせよ、
(解説:OpenTK_Primitives.dllによる基本図形の塗りつぶし X 3)
(解説:OpenTK_Primitives.dllによる基本図形のワイヤーフレームX 3)
ここまでは何とかこぎつけました。
しかし...次回に続く。






