找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3046|回复: 0

【OpenGL】不能再简单的OpenGL Demo

[复制链接]
发表于 2015-1-4 23:44:21 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
可以说是最简单的OpenGL的Demo了。并没有使用OpenGL EW。
只是完全用OpenGL替代了WM_PAINT用GDI显示Hello World而已。
从这个方面来说,D3D的初始化太麻烦了。
gl.png
  1. //=============================================================================
  2. //作者:0xAA55
  3. //网址:http://www.0xaa55.com/
  4. //请保留原作者信息,否则视为侵权。
  5. //-----------------------------------------------------------------------------
  6. #include<tchar.h>
  7. #include<Windows.h>

  8. #include<gl/GL.h>

  9. LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wp,LPARAM lp);//消息处理函数

  10. HDC                hDC;//HDC上下文
  11. HGLRC        hRC;//OpenGL上下文

  12. //=============================================================================
  13. //函数:InitOpenGL
  14. //描述:初始化OpenGL
  15. //-----------------------------------------------------------------------------
  16. void InitOpenGL(HDC hDC)
  17. {
  18.         PIXELFORMATDESCRIPTOR PFD={0};
  19.         int nPixelFormat;
  20.         PFD.nSize                =sizeof(PFD);
  21.         PFD.nVersion        =1;
  22.         PFD.dwFlags                =PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
  23.         PFD.iPixelType        =PFD_TYPE_RGBA;
  24.         //后台缓冲区格式
  25.         PFD.cDepthBits        =32;
  26.         PFD.cAlphaBits        =8;        PFD.cAlphaShift =24;
  27.         PFD.cBlueBits        =8;        PFD.cBlueShift        =16;
  28.         PFD.cGreenBits        =8;        PFD.cGreenShift        =8;
  29.         PFD.cRedBits        =8;        PFD.cRedShift        =0;
  30.         PFD.iLayerType        =PFD_MAIN_PLANE;

  31.         nPixelFormat=ChoosePixelFormat(hDC,&PFD);
  32.         SetPixelFormat(hDC,nPixelFormat,&PFD);//设置格式使其兼容OpenGL

  33.         hRC=wglCreateContext(hDC);//得到OpenGL上下文
  34.         if(!hRC)
  35.                 goto Cleanup;
  36. Cleanup:
  37.         //MessageBox(NULL,TEXT("初始化OpenGL没成功。"),TEXT("Fuck!"),MB_ICONERROR);
  38.         return;
  39. }

  40. //=============================================================================
  41. //函数:_tWinMain
  42. //描述:整个程序的入口点
  43. //-----------------------------------------------------------------------------
  44. int APIENTRY _tWinMain
  45. (
  46.         HINSTANCE hInst,
  47.         HINSTANCE hPrevInst,
  48.         LPTSTR szCmdLine,
  49.         int nShowCmd
  50. )
  51. {
  52.         WNDCLASSEX WndClass;
  53.         ATOM ClassAtom=0;
  54.         HWND hWnd;
  55.         MSG msg;

  56.         //注册窗口类
  57.         memset(&WndClass,0,sizeof(WndClass));
  58.         WndClass.cbSize=sizeof(WndClass);
  59.     WndClass.lpfnWndProc=WndProc;
  60.     WndClass.hInstance=hInst;
  61.         WndClass.hIcon=LoadIcon(hInst,MAKEINTRESOURCE(IDI_APPLICATION));
  62.     WndClass.hCursor=LoadCursor(hInst,MAKEINTRESOURCE(IDC_ARROW));
  63.     WndClass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
  64.     WndClass.lpszClassName=TEXT("NormalWindow");
  65.     WndClass.hIconSm=LoadIcon(hInst,MAKEINTRESOURCE(IDI_APPLICATION));
  66.         ClassAtom=RegisterClassEx(&WndClass);
  67.         if(!ClassAtom)
  68.                 goto Cleanup;

  69.         //创建窗口
  70.         hWnd=CreateWindowEx(0,(LPCTSTR)ClassAtom,TEXT("主窗口"),
  71.                 WS_OVERLAPPEDWINDOW,
  72.                 CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  73.                 NULL,NULL,hInst,NULL);
  74.         if(!hWnd)
  75.                 goto Cleanup;

  76.         //显示窗口
  77.         ShowWindow(hWnd,nShowCmd);
  78.         UpdateWindow(hWnd);

  79.         hDC=GetDC(hWnd);//取得窗口的GDI绘图句柄
  80.         InitOpenGL(hDC);//初始化OpenGL

  81.         //消息循环
  82.         while(GetMessage(&msg,NULL,0,0))
  83.         {
  84.                 TranslateMessage(&msg);
  85.                 DispatchMessage(&msg);
  86.         }

  87.         ReleaseDC(hWnd,hDC);

  88.         UnregisterClass((LPCTSTR)ClassAtom,hInst);
  89.         return 0;
  90. Cleanup:
  91.         if(ClassAtom)
  92.                 UnregisterClass((LPCTSTR)ClassAtom,hInst);
  93.         MessageBox(NULL,TEXT("启动程序失败。"),TEXT("无法启动程序"),MB_ICONEXCLAMATION);
  94.         return 1;
  95. }

  96. //=============================================================================
  97. //函数:WndProc
  98. //描述:窗口消息处理程序
  99. //-----------------------------------------------------------------------------
  100. LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wp,LPARAM lp)
  101. {
  102.         RECT rc;
  103.         switch(uMsg)
  104.         {
  105.         case WM_DESTROY:
  106.                 PostQuitMessage(0);
  107.                 break;
  108.         case WM_PAINT:
  109.                 wglMakeCurrent(hDC,hRC);//使OpenGL获取焦点

  110.                 GetClientRect(hWnd,&rc);//取得客户区域的大小
  111.                 glViewport(rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top);//设置观察区域大小

  112.                 glClear(GL_COLOR_BUFFER_BIT);//擦除画板
  113.                 glBegin(GL_TRIANGLES);//画三角形表

  114.                 glColor4d(1.0,0.0,0.0,1.0);//红色
  115.                 glVertex2d( 0.0, 0.5);//三角形的顶角
  116.                 glColor4d(0.0,1.0,0.0,1.0);//绿色
  117.                 glVertex2d(-0.5,-0.5);//三角形的左角
  118.                 glColor4d(0.0,0.0,1.0,1.0);//蓝色
  119.                 glVertex2d( 0.5,-0.5);//三角形的右角

  120.                 glEnd();//提交三角形表
  121.                 glFlush();//让显卡渲染

  122.                 SwapBuffers(hDC);//把画板内容刷到屏幕上
  123.                 wglMakeCurrent(NULL,NULL);//释放焦点
  124.                 break;
  125.         default:
  126.                 return DefWindowProc(hWnd,uMsg,wp,lp);
  127.         }
  128.         return 0;
  129. }
复制代码
BIN: UseGL.exe (74.5 KB, 下载次数: 3)
SRC: UseGL.7z (3.51 KB, 下载次数: 1, 售价: 1 个宅币)
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 12:09 , Processed in 0.036297 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表