/* * 中央に三角形を表示 */ #include #include /* 初期化の処理 */ void nmgl_init(void){ /* 背景色の指定 RGBA */ glClearColor(0.0, 0.0, 0.0, 0.0); } /* リサイズの処理 */ void nmgl_resize(int w, int h){ /* ビューポートの設定 */ glViewport(0, 0, w, h); /* 射影変換モードに */ glMatrixMode(GL_PROJECTION); /* 変換行列を単位行列に */ glLoadIdentity(); /* 透視射影の視野台形 左、右、下、上、手前、奥 */ glFrustum(-1.33, 1.33, -1.0, 1.0, 1.0, 5.0); /* モデル変換モードに戻す */ glMatrixMode(GL_MODELVIEW); } /* 描画の処理 */ void nmgl_paint(void){ /* 背景色でクリア */ glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslated(0.0, 0.0, -3.0); glPushMatrix(); glBegin(GL_TRIANGLES); glColor3d(1.0, 0.0, 0.0); glVertex3d(1.0, -0.6, 0.0); glVertex3d(-1.0, -0.6, 0.0); glVertex3d(0.0, 1.0, 0.0); glEnd(); glPopMatrix(); glFinish(); } /* 関数 */ BOOL bSetupPixelFormat(HDC hdc); /* ウィンドウプロシージャ */ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); /* メイン */ int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nCmdShow) { WNDCLASSEX wcex; char *wdName = "OpenGL on Win32API"; HWND hWnd; MSG msg; if(!hPrevInstance){ wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = NULL; wcex.lpszClassName = wdName; wcex.hIconSm = NULL; /* ウインドウクラスを登録 */ if(!RegisterClassEx(&wcex)){ return 0; } } /* ウインドウを作成 */ hWnd = CreateWindow( wcex.lpszClassName, wdName, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, // ウインドウのスタイル CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); /* ウインドウを表示 */ ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); /* メッセージループ */ while(GetMessage(&msg, NULL, 0, 0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } /* ウィンドウプロシージャ */ LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HDC hdc; static HGLRC hrc; switch (message) { case WM_CREATE: { hdc = GetDC(hWnd); /* ピクセルフォーマットの設定へ */ bSetupPixelFormat(hdc); /* レンダリングコンテキストの作成 */ hrc = wglCreateContext(hdc); /* レンダリングコンテキストをデバイスコンテキストに結びつける */ wglMakeCurrent(hdc, hrc); /* 初期化 */ nmgl_init(); } break; case WM_PAINT: { /* 描画 */ nmgl_paint(); /* ダブルバッファ反転 */ SwapBuffers(hdc); } break; case WM_SIZE: { RECT rect; GetClientRect(hWnd, &rect); /* リサイズ */ nmgl_resize(rect.right, rect.bottom); } break; case WM_DESTROY: { /* 後片付け */ wglMakeCurrent(hdc, 0); wglDeleteContext(hrc); ReleaseDC(hWnd, hdc); PostQuitMessage(0); } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } /* ピクセルフォーマットの設定 */ BOOL bSetupPixelFormat(HDC hdc) { static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), /* size of this pfd */ 1, /* version number */ PFD_DRAW_TO_WINDOW | /* support window */ PFD_SUPPORT_OPENGL | /* support OpenGL */ PFD_DOUBLEBUFFER, /* double buffered */ PFD_TYPE_RGBA, /* RGBA type */ 24, /* 24-bit color depth */ 0, 0, 0, 0, 0, 0, /* color bits ignored */ 0, /* no alpha buffer */ 0, /* shift bit ignored */ 0, /* no accumulation buffer */ 0, 0, 0, 0, /* accum bits ignored */ 32, /* 32-bit z-buffer */ 0, /* no stencil buffer */ 0, /* no auxiliary buffer */ PFD_MAIN_PLANE, /* main layer */ 0, /* reserved */ 0, 0, 0 /* layer masks ignored */ }; int pixelformat; if((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0){ MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); return FALSE; } if(SetPixelFormat(hdc, pixelformat, &pfd) == FALSE) { MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); return FALSE; } return TRUE; }