約 3,023,898 件
https://w.atwiki.jp/bambooflow/pages/197.html
OpenGLのメモ書き OpenGLは世代(バージョン)によってコーディング方法に互換性がありません。 そのため世代に合わせたコーディングスタイルを身につけなければなりません。 大きく分類と、次の2つに分けられます。 固定機能シェーダ プログラマブルシェーダ ここでは、 OpenGL2.xまでは主に固定機能シェーダについて、 OpenGL3.x以上からは主にプログラマブルシェーダについて述べたいと思います。 OpenGL1.x OpenGL2.x (OpenGL ES1) OpenGL3.x - core profile (OpenGL ES2) History QtでOpenGL OpenGLツール glut glew - OpenGL4.xを試すには必須 gl3w - OpenGL3.x 4.x core profile GLM - OpenGL Mathematics SDL デバッグツール glslDevil gDEBuggerに似たGUIデバッグツール,GLSL対応 gDEBugger freeになったようです。 BuGLe (OpenGLデバッガ) 参考 http //www.opengl.org/wiki/
https://w.atwiki.jp/opengles/pages/23.html
OpenGL® ES is a software interface to graphics hardware. The interface consists of a set of procedures and functions that allow a programmer to specify the objects and operations involved in producing high-quality graphical images, specifically color images of three-dimensional objects. [n.n.n] refers to sections and tables in the OpenGL ES 2.0 specification. [n.n.n] refers to sections in the OpenGL ES Shading Language 1.0 specification. Specifications are available at www.opengl.org/registry/gles
https://w.atwiki.jp/bambooflow/pages/276.html
OpenGL2.x OpenGL2.x系の処理を記載する。 バッファオブジェクトが導入されたバージョン。 また最終的にGLSLはサポートされる。
https://w.atwiki.jp/opengles/pages/24.html
Open GL ES commands are formed from a return type, a name, and optionally a type letter i for 32-bit int, or f for 32-bit float, as shown by the prototype below return-type Name{1234}{if}{v} ([args ,] T arg1 , . . . , T argN [, args]); The arguments enclosed in brackets ([args ,] and [, args]) may or may not be present. The argument type T and the number N of arguments may be indicated by the command name suffixes. N is 1, 2, 3, or 4 if present, or else corresponds to the type letters. If “v” is present, an array of N items is passed by a pointer. For brevity, the OpenGL documentation and this reference may omit the standard prefixes. The actual names are of the forms glFunctionName(), GL_CONSTANT, GLtype
https://w.atwiki.jp/opengl/pages/14.html
なぜ、DirectXではなくOpenGLなのか? 最新のグラフィックス、最速の描画を行うのであれば間違いなくDirectXがベストですが、 3Dを勉強したい、ころころ変わるDirectXにはついて行けないという方、いろんなOSで シェーダーモデル5.0を使いたいという方にはOpenGLをおススメします。 OpenGL 4.0 OpenGL4.0を駆使すれば、MacOSやLinux、Windows XP、Vista、7、8の4世代のWindowsに渡って DirectX 11世代のシェーダーモデル5.0を使う事ができます。 DirectXより簡単 当サイト管理人の感想ですが、DirectXに比べてOpenGLは割と簡単な印象を受けます。 業界標準となる可能性 OpenGLが右手座標系、DirectXが左手座標系を採用しているのは大きな明暗。 数学やほとんどの3Dアプリでは右手座標系を使用しています。 ODEやOpenALなども、そうです。つまり右手座標系が業界標準だったのです。 最近ではDirectXも左手座標系と右手座標系を選べるようになったのですが、 統一されていないのは混乱を招く種です。 また、OpenGLはプレイステーション1,2,3、iphoneアプリなどのSDKとして 採用されています。 C/C++を使う理由 言うまでもなく、豊富な各種ライブラリと過去の遺産を無駄にする事なく プログラミングするためです。 実行速度という点では、アセンブラに劣るでしょうが、VisualC++の場合、 MASMがインラインアセンブラで使えます。 GUIに関してはC#、VisualBasic、JAVA + Swingに、分があるように感じるかも しれませんが、.NET Frameworkでしたら、C++/CLIを用いる事でC#と同等の GUIができます。 さらに、C++/CLIの言語仕様もJAVAのような完全なオブジェクト指向ではないため、 オブジェクトが存在しなかった時の例外処理等を記述しなくても良く、 非常に楽をする事ができます。 C#で追加されたガベージコレクションやファイナライザといった機能も併せ持って いる上に、単純に同じようなアプリケーションを作成した場合、C#製の物よりも C++/CLI製の.NETアプリの方が速いようです。 つまり、現時点でWindows環境下において、究極の開発言語という事になります。 freeglutを使う理由 これも言うまでもなく、圧倒的にプログラムコード量を減らし楽をするためです。 また、単純にOpenGLの使い方を覚える点で面倒な初期化関連やウインドウの 作成などの手間を省くためです。 「こんなに簡単にOpenGLプログラミングできるんだ」という事を体験するには freeglutが1番適していると思ったからです。 var so = new SWFObject( http //chuka-tube.com/wp-content/themes/141210_pc/jw/player.swf , mpl , 426 , 320 , 9 ); so.addParam( allowfullscreen , true ); so.addParam( allowscriptaccess , always ); so.addParam( wmode , opaque ); so.addVariable( file , http //dd.yinyuetai.com/uploads/videos/common/F25901494A27F1964FD2A25634ABD357.mp4?sc=dac1ced33549d3a4 ); so.addVariable( image , http //img.chuka-tube.com/music/26/2164508.jpg ); so.addVariable( provider , http ); so.addVariable( autostart , false ); so.addVariable( backcolor , EEEEEE ); so.addVariable( frontcolor , 666666 ); so.addVariable( lightcolor , 888888 ); so.addVariable( screencolor , 000000 ); so.addVariable( volume , 100 ); so.write( mediaspace );
https://w.atwiki.jp/opengl/pages/15.html
Visual Studio 2022 Community のインストール Visual Studio 2022 Community https //visualstudio.microsoft.com/ja/downloads/ こちらから、Visual Studio 2022 Community をインストールしてください。 デフォルトだと開発環境の背景色が『濃色』になっていて見にくいので『淡色』に変更します。 ツール→オプションの環境→全般の配色テーマを『淡色』にします。 これで昔ながらの見やすい開発環境になりました。 Visual Studio 2012 Express for Windows Desktop のインストール Visual Studio 2012 Express for Windows Desktop http //www.microsoft.com/visualstudio/jpn/downloads こちらから、Visual Studio 2012 Express for Windows Desktop を インストールしてください。 Visual Studio 2012 のアイコンライブラリー入手方法 Visual Studio 2010までは特定のフォルダにインストールされていましたが、 Visual Studio 2012はバグによりアイコンライブラリーはインストールされないようです。 http //www.microsoft.com/en-us/download/details.aspx?id=35825 こちらから、Visual Studio Image Library をダウンロードして解凍してください。 freeglut のインストール OpenGLを簡単に使用できるようにするためのユーティリティとして、glut がありますが、 glut はver3.7で更新が止まっています。 また、glut には色々と不備がありますので glut を拡張した freeglut を使用します。 freeglut http //freeglut.sourceforge.net/ こちらから freeglut をダウンロードしてください。 以前は freeglut を CMAKE していましたが、今は GitHub から直接 Visual Studio 2022 でライブラリファイルを作れるようです。 freeglutのページを下の方にスクロールしていくと GitHub のリポジトリのリンクがあるので右クリックして、リンクのアドレスをコピーします。 Visual Studio 2022 を起動して起動ウィザードのリポジトリのクローン(C)を押します。 リポジトリの場所の所に先ほどのコピーしたリンクのアドレスをペーストします。 クローンボタンを押します。 ソリューションエクスプローラーのフォルダービューをダブルクリックします。 フォルダービューが展開されて freeglut の リポジトリのクローンが表示されました。 メニューの下にあるツールバーの中の x64-Debug となっている構成設定のプルダウンをクリックして、 構成を管理します...のメニューアイテムをクリックします。 すると、CMakeの設定ページが出てきます。 x64-Debugの設定は既にあるのでそのままで、構成の所の下にあるプラスボタン[+]を押します。 CMakeSettingsのダイアログが出てくるので x64-Release を選択します。 これで64bitのデバッグとリリースの設定ができました。 今度は32bitの設定をします。 また構成の所の下にあるプラスボタン[+]を押します。 CMakeSettingsのダイアログの x86-Debug を選択します。 32ビットのデバッグ版の設定ができたので今度はリリース版の設定をします。 また構成の所の下にあるプラスボタン[+]を押します。 CMakeSettingsのダイアログの x86-Release を選択します。 これで全ての構成設定ができたので CMake の設定ページを閉じます。 保存ダイアログが出てくるので保存ボタンを押します。 メニューの下にあるツールバーの中の x64-Debug となっている構成設定のプルダウンをクリックすると、 x64-Debug x64-Release x86-Debug x86-Release この4つの設定が出てきます。 これで準備が整いました。 メニューのビルド、すべてビルドを選択します。 ソリューションの freeglut\out\build\x64-Debug\lib\ に64ビットデバッグ版の .lib ができています。 メニューの下にあるツールバーの中の x64-Debug となっている構成設定のプルダウンをクリックして、 x64-Release にします。 メニューのビルド、すべてビルドを選択します。 ソリューションの freeglut\out\build\x64-Release\lib\ に64ビットリリース版の .lib ができています。 同様にして、32ビット版のライブラリを作ります。 メニューの下にあるツールバーの中の構成設定のプルダウンをクリックして、 x86-Debug にします。 メニューのビルド、すべてビルドを選択します。 ソリューションの freeglut\out\build\x86-Debug\lib\ に32ビットデバッグ版の .lib ができています。 やっと最後です。 メニューの下にあるツールバーの中の構成設定のプルダウンをクリックして、 x86-Release にします。 メニューのビルド、すべてビルドを選択します。 ソリューションの freeglut\out\build\x86-Release\lib\ に32ビットリリース版の .lib ができています。 これで64ビットと32ビットのデバッグとリリースの .lib が作れました。 GLEW のインストール OpenGLでプログラマブルシェーダー GLSL を使うためのライブラリです。 http //glew.sourceforge.net/ こちらから GLEW をダウンロードしてください。 glewで色々と問題が出るようなので解説です。 まず、glewのオフィシャルからglewのソースをダウンロードします。 http //glew.sourceforge.net/ 今回はglew-1.10.0.zipをダウンロードしました。 それを解凍して 解凍フォルダ \glew-1.10.0\build\vc10\ にあるglew.slnを起動します。 初回起動の時は更新のポップアップウインドウが出るので更新します。 プロジェクトの構成をReleaseのWin32にします。 ソリューションエクスプローラーのglew_sharedを右クリックしてプロパティを 表示します。 構成プロパティのリンカーの詳細設定の安全な例外ハンドラーを含むイメージ が最初は「はい(/SAFESEH)」になっているので消去して空欄にします。 プロジェクトのプロパティのランタイムライブラリをマルチスレッドにします。 そのままソリューションをビルドすると文字列リテラルが長すぎるという エラーがでます。 glew.rcのエラーが出た部分をコメントアウトします。 再度、ソリューションをビルドしてみましょう。 すると今回は正常に終了します。 そこまで出来たら、各種ファイルを配置しましょう。 解凍フォルダ \glew-1.10.0\include\GL\ にあるglew.h、glxew.h、wglew.hを C \Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\GL\ にコピーします。 解凍フォルダ \glew-1.10.0\lib\Release\Win32\ にあるglew32.lib、glew32s.libを C \Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\ にコピーします。 解凍フォルダ \glew-1.10.0\bin\Release\Win32\ にあるglew32.dllを C \Windows\SysWOW64\ にコピーします。 これでglewが使えるようになりました。 OpenGL SDK のインストール OpenGLの拡張機能です。 https //registry.khronos.org/OpenGL/index_gl.php#headers の、glext.h https //registry.khronos.org/OpenGL/api/GL/glext.h と、glcorearb.h https //registry.khronos.org/OpenGL/api/GL/glcorearb.h と、glxext.h https //registry.khronos.org/OpenGL/api/GL/glxext.h と、wglext.h https //registry.khronos.org/OpenGL/api/GL/wglext.h を glew のインクルードフォルダにある GL フォルダにコピーして下さい。 KHR/khrplatform.h は要らないかと思います。 以下は過去記事 OpenGLの拡張機能です。 http //www.opengl.org/registry/ の、glext.h http //www.opengl.org/registry/api/glext.h と、glxext.h http //www.opengl.org/registry/api/glxext.h と、wglext.h http //www.opengl.org/registry/api/wglext.h をOpenGLのインクルードフォルダにコピーして下さい。 LodePNG のインストール このサイトのプログラムは LodePNG version 20100314 を使用しています。 http //members.gamedev.net/lode/projects/LodePNG/ 現在の最新版 LodePNG は引数などが大幅に変更されています。 LodePNG は作者様の意向により改変、再配布等が自由に行える模様ですので LodePNG version 20100314 を、ここで再配布致します。 lodepng.cpp lodepng.h OpenAL のインストール https //www.openal.org/ の Downloads から OpenAL 1.1 Core SDK (OpenAL11CoreSDK.zip) と OpenAL 1.1 Windows Installer (oalinst.zip) をダウンロードして解凍して それぞれのインストーラーを実行します。 ALUT のインストール https //directory.fsf.org/wiki/Freealut の Download から freealut_1.1.0.orig.tar をダウンロードして 解凍して適当な場所に配置します。 プロジェクトの作成 (64bitアプリケーション) Visual Studio 2022(C/C++)を起動して 新しいプロジェクトの作成→コンソールアプリを選択して、次へボタンを押します。 プロジェクト名を適当に付けて作成ボタンを押します。 するとWindowsの64ビットアプリ(X64アプリ)が作成されます。 そのままデバッグメニューのデバッグ開始を押すと、Visual StudioデフォルトのHello World!プログラムが起動します。 その.cppファイルに当サイトのプログラムをコピー ペーストして.hファイルを追加してビルドすると実行ファイルが出来上がります。 プロジェクトの作成 (32bitアプリケーション) 上記のプロジェクトの作成 (64bitアプリケーション)で64bitプロジェクトを作り、構成設定をx86にします。 これだけです。 以下は過去記事(Visual Studio 2012) Visual C++ を起動して ファイル → 新規作成 → プロジェクト を選択します。 Win32 の Win32 コンソール アプリケーション を選択します。 プロジェクト名とソリューション名を適当に付けて OK ボタンを押します。 すると Win32 アプリケーション ウィザードが起動するので アプリケーションの設定 を選択します。 コンソール アプリケーションを選択し、 空のプロジェクト にチェックします。 そして 完了ボタンを押すとプロジェクトが出来上がります。 後は、プロジェクトに .cpp や .h を追加して当サイトのサンプルをビルドして下さい。
https://w.atwiki.jp/pspt/pages/248.html
OpenGL OpenGLはグラフィックスハードウェアのAPI。 2次元・3次元コンピュータグラフィックス両方が扱えどのOSでも使う事ができる。 他のグラフィックスハードウェアのAPIはMS社のDirectXなどがある。 OpenGL導入の仕方(osがwindowsで開発環境がvisual c++の場合) OpenGLのHello world 二次元の図形を表示させたい! 参考 導入の仕方(osがwindowsで開発環境がvisual c++の場合) OpenGL自体はどのosにも大抵入っているが動かせるようにするにはちょっとした手続きが必要です。 まずここからglut-3.7.6-bin.zipをダウンロードし解凍しましょう。 glut32.dll glut32.lib glut.h というファイルがあるのでdllをOSが 32bitならC \Windows\System32に 64bitならC \Windows\SysWOW64に に置きましょう。 続いてglut.hを\Microsoft Visual Studio 11.0\VC\include\gl(glがなければ作る) glut32.libを\Microsoft Visual Studio 11.0\VC\lib に置きましょう。 これで#include gl/glut.h とおいてコンパイルエラーが起こらなければ成功です。 設定はこれだけです。 注意 glut.hをインクルードする時はstdio.hとstdlib.hを先頭にして下さい。 OpenGLのHello world #include GL/glut.h void display(void) { } int main(int argc, char *argv[]) { glutInit( argc, argv); glutCreateWindow("hello world"); glutDisplayFunc(display); glutMainLoop(); return 0; } void glutInit(int *argc, char **argv) GLUT および OpenGL 環境を初期化します。 引数には main の引数をそのまま渡します. X Window で使われるオプション -display などはここで処理されます. この関数によって引数の内容が変更されます. int glutCreateWindow(char *name) ウィンドウを開きます. 引数 name はそのウィンドウの名前の文字列で, タイトルバーなどに表示されます. void glutDisplayFunc(void (*func)(void)) 引数 func は開いたウィンドウ内に描画する関数へのポインタです. ウィンドウが開かれたり, 他のウィンドウによって隠されたウィンドウが再び現れたりして, ウィンドウを再描画する必要があるときに, この関数が実行されます. したがって, この関数内で図形表示を行います. void glutMainLoop(void) これは無限ループです. この関数を呼び出すことで, プログラムはイベントの待ち受け状態になります. この関数がないとウィンドウが一瞬で消えてしまいます。 図形の描写はdiplay関数内で行われます。 二次元の図形を表示させたい! 参考 GLUTによる「手抜き」OpenGL入門 http //www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html OpenGL de プログラミング http //wiki.livedoor.jp/mikk_ni3_92/
https://w.atwiki.jp/cglab/pages/22.html
初心者向けチュートリアル 筑波大学岩田研究室 OpenGLのゼミの資料を公開なさっています。 ◆◇ 高速OpenGL講座 ◇◆ 九州大学 大学院 のOpenGL講座 内容を絞ってあるので、コストパフォーマンスに優れます。しかし、auxライブラリを使用しているのでglutへの修正が必要です。ちなみにauxライブラリはglutライブラリの1世代前のライブラリです。 ピックアップ処理 ピックアップ処理とは、マウスで3Dオブジェクトを選択することです。これを行うことによりドラッグで移動、スケーリング、回転といった操作が可能になります。 OpenGL de プログラミング ピックアップ処理 マウスでクリックした場所の3次元位置を求めるには? 和歌山大学床井研究室
https://w.atwiki.jp/usonx/pages/21.html
VC++(MFC)とOpenGL MFCとOpenGLの親和性は高い。逆にMFCとDirectXの親和性は低く、現在のバージョンにおいて、MFC+DirectXの組み合わせは難しい。理由としては、そもそもDirectX自体がMFCを前提としなくなったこと。SampleからMFCtex(MFC+DirectXのサンプル)が消えている。MFCtexがあるバージョンは、DirectX9(2003)のようだが、探した限りではMicrosoft上には見当たらなかった(仮にあったとしてもVC++6のものとなる。VC++2005では、そのままコンパイルできない)。 OpenGLのインストール 1.GLUTのダウンロード 下記サイトから"glut-3.7.6-bin.zip"をダウンロードし、適当なフォルダに解凍する。 http //www.xmission.com/~nate/glut.html 2.ファイルのコピー 解凍したファイルを下記ディレクトリに移動する。フォルダ名は環境によって若干異なる。.hは、GLフォルダを作りその中に入れること。 glut.h → C \Program Files\Microsoft Visual Studio\VC98\Include\GL .lib → C \Program Files\Microsoft Visual Studio\VC98\Lib .dll → C \WINDOWS\SYSTEM32 MFC(ダイアログベース)+OpenGL プロジェクト名をhogeとすると、 1.ヘッダファイルの記述 クラスChogeDlgに以下includeを追加 \#include GL/glaux.h 2.メンバ変数の追加 クラスChogeDlgに以下変数を追加する CDC* m_pDC; HGLRC m_GLRC; 3.メンバ関数の追加 int ChogeDlg SetDCPixelFormat(HDC hdc) { static PIXELFORMATDESCRIPTOR pfd = { sizeof (PIXELFORMATDESCRIPTOR),// Size of this structure 1,// Version number PFD_DRAW_TO_WINDOW |// Flags PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,// RGBA pixel values 24,// 24-bit color 0, 0, 0, 0, 0, 0,// Don t care about these 0, 0,// No alpha buffer 0, 0, 0, 0, 0,// No accumulation buffer 32,// 32-bit depth buffer 0,// No stencil buffer 0,// No auxiliary buffers PFD_MAIN_PLANE,// Layer type 0,// Reserved (must be 0) 0, 0, 0// No layer masks }; int nPixelFormat; nPixelFormat = ChoosePixelFormat (hdc, pfd); if (SetPixelFormat(hdc, nPixelFormat, pfd) == FALSE){ // SetPixelFormat error return FALSE ; } if (DescribePixelFormat(hdc, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), pfd) == 0) { // DescribePixelFormat error return FALSE ; } if (pfd.dwFlags PFD_NEED_PALETTE) { // Need palete ! } return TRUE ; } void ChogeDlg InitGL() { m_pDC = new CClientDC(this); // Get device context SetDCPixelFormat(m_pDC- m_hDC); // Set OpenGL pixel format m_GLRC = wglCreateContext (m_pDC- m_hDC); // Create rendering context wglMakeCurrent (m_pDC- m_hDC, m_GLRC); // Current context set glClearColor(0.0f, 0.0f, 0.5f, 1.0f); } void ChogeDlg DrawGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ; } BOOL ChogeDlg OnInitDialog() の return TRUE; の上に InitGL(); を追加する. ClassView@ChogeDlg→メッセージ で WM_DESTROY をダブルクリックし, OnDestroy を呼ぶ. void ChogeDlg OnDestroy() { CView OnDestroy(); // TODO この位置にメッセージ ハンドラ用のコードを追加してください wglMakeCurrent(NULL, NULL); // free current context wglDeleteContext(m_GLRC); // Delete rendering context delete m_pDC; // Release device context } OnPaint に以下の文を追加. void COpenGLTest2Dlg OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 描画用のデバイス コンテキスト SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // クライアントの矩形領域内の中央 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect( rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // アイコンを描画します。 dc.DrawIcon(x, y, m_hIcon); } else { CDialog OnPaint(); DrawGL(); //これを追加 SwapBuffers(m_pDC- m_hDC); //これを追加 } } Pictureコントロール上に描画するには、 ダイアログにピクチャボックスを設置する.(大きさは適当) ID→ID_PICT に書き換え,クラスウィザードで ID_PICT の変数を追加する. コントロールID タイプ メンバ IDC_PICT CStatic m_Pict InitGL() に一文を追加する. void COpenGLTest2Dlg InitGL() { m_pDC = new CClientDC(this); m_pDC- m_hDC = m_Pict.GetDC()- GetSafeHdc(); //これを追加 SetDCPixelFormat(m_pDC- m_hDC); m_GLRC = wglCreateContext (m_pDC- m_hDC); wglMakeCurrent (m_pDC- m_hDC, m_GLRC); glClearColor(0.0f, 0.0f, 0.5f, 1.0f); }
https://w.atwiki.jp/opengl/pages/286.html
こちらに OpenGL Simple Adapter があるので使わせてもらいます。 nursの日記http //d.hatena.ne.jp/nurs/20080315/1205598655 使い方は OpenGL Simple Adapter.h をインクルードして OpenGLSimpleAdapter のインスタンスを作成して GLAdapter- BeginRender(); と GLAdapter- EndRender(); の間に いつもの OpenGL のコードを記述するだけです。 OpenGL Simple Adapter.h #pragma once #pragma comment( lib, opengl32.lib ) #pragma comment( lib, glu32.lib ) #pragma comment( lib, gdi32.lib ) #pragma comment( lib, User32.lib ) #include windows.h #include gl/gl.h #include gl/glu.h //↑こいつの#include は、たぶんこことかではなく、 // コードの中でもusing namespace System;とか記述する // よりも前にしないと、C2872 に苦しめられることになる。 public ref class OpenGLSimpleAdapter // ↑CLRでやる場合は、class の前に、public ref を入れてね { // // OpenGL Simple Adaptor loOGLHost (C) 2008 nurs // // 使い方: // 1)本クラスのインスタンスを、ターゲットビューのメンバとして作成する。 // コンストラクタのHDCは、Win32なら // ⇒ GetDC( this- GetSafeHwnd() ) ); // CLRのFormなら、 // ⇒ GetDC( (HWND)parentForm- Handle.ToPointer() ); // などとして取ってきます。 // 2)ターゲットビューの、適切な箇所(初期化、描画、リサイズ)にて、 // 本ホストの、BeginRender()と、EndRender() を呼び出し、その間に、 // 目的のOpenGL描画コードを記述します。 // *)ちなみに利用側コードのどこかのcpp内にて、 //#pragma comment( lib, opengl32.lib ) //#pragma comment( lib, glu32.lib ) //#pragma comment( lib, gdi32.lib ) //#pragma comment( lib, User32.lib ) // の記述も、忘れないで下さい。 // // ★RenderPolicyを予め作成しておき、必要なときに必要な描画 // ポリシーで、Render() をかける、という使い方もできます。 // ★注意:WindowsForm、.NET環境の場合は、プロジェクトの共通言語 // ランタイムサポートを、/clr pure ではなく、/clr にする。 // // public OpenGLSimpleAdapter( HDC dc ){ if(dc==0) return; m_hdc = dc; { static PIXELFORMATDESCRIPTOR pfd={ sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; GLint iPixelFormat; if( (iPixelFormat = ChoosePixelFormat(m_hdc, pfd) ) == 0) return; if(SetPixelFormat(m_hdc, iPixelFormat, pfd) == FALSE) return; } if( (m_hglrc = wglCreateContext(m_hdc) )==0) return; // pure Managed だとランタイムでエラーに if( (wglMakeCurrent(m_hdc, m_hglrc) )==0) return; wglMakeCurrent(0, 0); return; } ~OpenGLSimpleAdapter( void ){} template class RenderPolicy void Render( RenderPolicy po ){ wglMakeCurrent( this- m_hdc, this- m_hglrc ); po(); wglMakeCurrent( this- m_hdc, 0 ); SwapBuffers( this- m_hdc ); } HDC BeginRender( void ){ wglMakeCurrent( this- m_hdc, this- m_hglrc ); return this- m_hdc; } void EndRender( void ){ wglMakeCurrent( this- m_hdc, 0 ); SwapBuffers( this- m_hdc ); } void EndRenderNoSwap( void ){ wglMakeCurrent( this- m_hdc, 0 ); } private HDC m_hdc; HGLRC m_hglrc; }; /*使用例 まず、OpenGLSimpleAdapterのインスタンスを作成します。 そして、BeginRender() と、EndRender() の間に目的のOpenGLのgl描画コードを書きます。 private System Void Form1_Load(System Object^ sender, System EventArgs^ e) { GLAdapter = gcnew OpenGLSimpleAdapter(GetDC( (HWND)panel1- Handle.ToPointer() )); } private System Void panel1_Paint(System Object^ sender, System Windows Forms PaintEventArgs^ e) { GLAdapter- BeginRender(); { glClearColor( 0,0,0,0 ); glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ); } GLAdapter- EndRender(); } */ MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace opengl; [STAThreadAttribute] int main(){ MyForm ^form1 = gcnew MyForm; form1- ShowDialog(); return 0; } MyForm.h #pragma once #include OpenGL Simple Adapter.h namespace opengl { using namespace System; using namespace System ComponentModel; using namespace System Collections; using namespace System Windows Forms; using namespace System Data; using namespace System Drawing; /// summary /// MyForm の概要 /// /summary public ref class MyForm public System Windows Forms Form { public MyForm(void) { InitializeComponent(); // //TODO ここにコンストラクター コードを追加します // } protected /// summary /// 使用中のリソースをすべてクリーンアップします。 /// /summary ~MyForm() { if (components) { delete components; } } private System Windows Forms Panel^ panel1; protected private /// summary /// 必要なデザイナー変数です。 /// /summary System ComponentModel Container ^components; #pragma region Windows Form Designer generated code /// summary /// デザイナー サポートに必要なメソッドです。このメソッドの内容を /// コード エディターで変更しないでください。 /// /summary void InitializeComponent(void) { this- panel1 = (gcnew System Windows Forms Panel()); this- SuspendLayout(); // // panel1 // this- panel1- Location = System Drawing Point(24, 24); this- panel1- Name = L panel1 ; this- panel1- Size = System Drawing Size(218, 182); this- panel1- TabIndex = 0; this- panel1- Paint += gcnew System Windows Forms PaintEventHandler(this, MyForm panel1_Paint); // // MyForm // this- AutoScaleDimensions = System Drawing SizeF(6, 12); this- AutoScaleMode = System Windows Forms AutoScaleMode Font; this- ClientSize = System Drawing Size(284, 261); this- Controls- Add(this- panel1); this- Name = L MyForm ; this- Text = L MyForm ; this- ResumeLayout(false); } #pragma endregion void Line2D(int x1,int y1,int x2, int y2,float size){ glLineWidth(size); glBegin(GL_LINES); glVertex2i(x1,y1); glVertex2i(x2,y2); glEnd(); } private System Void panel1_Paint(System Object^ sender, System Windows Forms PaintEventArgs^ e) { OpenGLSimpleAdapter^ GLAdapter = gcnew OpenGLSimpleAdapter(GetDC( (HWND)panel1- Handle.ToPointer() )); GLAdapter- BeginRender(); { glClearColor( 0,0,0,0 ); glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ); glOrtho(0, panel1- Width, panel1- Height, 0, -1, 1); glColor4f(1.0f,1.0f,1.0f,1.0f); Line2D(20,40,200,180,1.0); } GLAdapter- EndRender(); } }; }