在Win32下搭建opengl绘制环境
来源:互联网 发布:千里江山图 知乎 编辑:程序博客网 时间:2024/05/18 03:03
在官方标准教程中使用glfw3来创建opengl的窗体,处理输入相关消息。本文介绍下如何在win32下搭建opengl绘制环境。
以下是在win32下搭建opengl绘制环境的流程
1.入口函数:int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
2.窗口处理函数:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
3.注册窗口类型:WNDCLASS 注册函数RegisterClass
4.创建窗口:CreateWindow
5.获取DC:GetDC( hWnd );
6.初始化PIXELFORMATDESCRIPTOR
7.设置像素结构:SetPixelFormat
8.创建RC:wglCreateContext
9.设置opengl渲染环境:wglMakeCurrent
10.善后处理:wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC );ReleaseDC( hWnd, hDC );
11:主循环:PeekMessage处理相关消息,其他时候进行opengl绘制。
以下代码源自opengl.org提供的链接
//// GLSAMPLE.CPP// by Blaine Hodge//// Includes#include <windows.h>#include <gl/gl.h>// Function DeclarationsLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);// WinMainint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow){WNDCLASS wc;HWND hWnd;HDC hDC;HGLRC hRC;MSG msg;BOOL quit = FALSE;float theta = 0.0f;// register window classwc.style = CS_OWNDC;wc.lpfnWndProc = WndProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = hInstance;wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );wc.hCursor = LoadCursor( NULL, IDC_ARROW );wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );wc.lpszMenuName = NULL;wc.lpszClassName = "GLSample";RegisterClass( &wc );// create main windowhWnd = CreateWindow( "GLSample", "OpenGL Sample", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,0, 0, 256, 256,NULL, NULL, hInstance, NULL );// enable OpenGL for the windowEnableOpenGL( hWnd, &hDC, &hRC );// program main loopwhile ( !quit ){// check for messagesif ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){// handle or dispatch messagesif ( msg.message == WM_QUIT ) {quit = TRUE;} else {TranslateMessage( &msg );DispatchMessage( &msg );}} else {// OpenGL animation code goes hereglClearColor( 0.0f, 0.0f, 0.0f, 0.0f );glClear( GL_COLOR_BUFFER_BIT );glPushMatrix();glRotatef( theta, 0.0f, 0.0f, 1.0f );glBegin( GL_TRIANGLES );glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, 1.0f );glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.87f, -0.5f );glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( -0.87f, -0.5f );glEnd();glPopMatrix();SwapBuffers( hDC );theta += 1.0f;}}// shutdown OpenGLDisableOpenGL( hWnd, hDC, hRC );// destroy the window explicitlyDestroyWindow( hWnd );return msg.wParam;}// Window ProcedureLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){switch (message){case WM_CREATE:return 0;case WM_CLOSE:PostQuitMessage( 0 );return 0;case WM_DESTROY:return 0;case WM_KEYDOWN:switch ( wParam ){case VK_ESCAPE:PostQuitMessage(0);return 0;}return 0;default:return DefWindowProc( hWnd, message, wParam, lParam );}}// Enable OpenGLvoid EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC){PIXELFORMATDESCRIPTOR pfd;int format;// get the device context (DC)*hDC = GetDC( hWnd );// set the pixel format for the DCZeroMemory( &pfd, sizeof( pfd ) );pfd.nSize = sizeof( pfd );pfd.nVersion = 1;pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;pfd.iPixelType = PFD_TYPE_RGBA;pfd.cColorBits = 24;pfd.cDepthBits = 16;pfd.iLayerType = PFD_MAIN_PLANE;format = ChoosePixelFormat( *hDC, &pfd );SetPixelFormat( *hDC, format, &pfd );// create and enable the render context (RC)*hRC = wglCreateContext( *hDC );wglMakeCurrent( *hDC, *hRC );}// Disable OpenGLvoid DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC){wglMakeCurrent( NULL, NULL );wglDeleteContext( hRC );ReleaseDC( hWnd, hDC );}
0 0
- 在Win32下搭建opengl绘制环境
- WIN32 opengl环境搭建
- vc++中WIN32下OpenGL绘制框架
- 在Win32下使用OpenGL
- opengl win32 console测试环境搭建
- 在WIN32下搭建PHP开发环境,部署HDWiki
- [cocos2dx]在windows7下搭建Cocos2D-X win32开发环境
- WIN32 opengl三角形绘制
- 在Win32 OpenGL环境渲染CEGUI界面
- 在vxworks下进行OpenGL编程的环境搭建
- 在win7下搭建OpenGL ES 2.0的开发环境
- 在Visual C++下搭建OpenGL的开发环境
- OpenGL Windows下环境搭建
- vs2013环境下搭建openGL开发环境
- GTK+开发环境在win32&VC++6 IDE环境下的搭建(prebuild,非src)
- WIN32 opengl绘制一个点
- cocos2d_x 在win32上面的环境搭建
- windows下搭建OpenGL ES开发环境
- 判断手机是否安装某程序的方法:
- ios js互调
- C++实验2-两数差的绝对值
- 在Facebook被刷爆的一组动漫图【展览设计师培训】
- linux命令学习一 :touch和mkdir 创建文件和文件夹
- 在Win32下搭建opengl绘制环境
- Scrapy - 爬虫框架
- JAVA_WEB学习经验总结
- Java day04 静态static,静态代码块
- LeetCode 之 Search a 2D Matrix II
- Mybatis 分页插件 3.3.0 发布
- 关于运行报错
- android 从网络加载图片并显示
- JS省份和城市选择控件