opengl 在winCE系统的使用

WINCE系统上开发OpenGL程序需具备以下条件:

1. 处理器的支持,嵌入式处理器需支持3D加速渲染(测试使用的是Telichips 8901);

2. WINCE内核的支持,定制内核时需添加OpenGL ES相关组件。

以下是具体的参考代码:

[cpp] view plain copy

  1. /********************************************************************
  2. filename:   WinceOpenGLDemo.cpp
  3. created:    2011-01-05
  4. author:     firehood
  5. purpose:    利用OpenGL ES实现了绘制立方体和纹理效果
  6. *********************************************************************/
  7. // WinceOpenGLDemo.cpp : 定义应用程序的入口点。
  8. //
  9. #include "stdafx.h"
  10. #include "WinceOpenGLDemo.h"
  11. #include <windows.h>
  12. #include <commctrl.h>
  13. #include "ImgLoader.h"
  14. // OpenGL ES Includes
  15. #include <GLES/gl.h>
  16. #include <GLES/glext.h>
  17. #include <EGL/egl.h>
  18. #include <EGL/eglext.h>
  19. // OpenGL lib
  20. #pragma comment(lib, "OpenGlLib\\libGLESv1_CM.lib")
  21. #pragma comment(lib, "OpenGlLib\\libEGL.lib")
  22. // 全局变量:
  23. HINSTANCE   g_hInst;            // 当前实例
  24. TCHAR       szAppName[] = L"OpenGLES";        /*The application name and the window caption*/
  25. CImgLoader  g_Image;
  26. // OpenGL variables
  27. EGLDisplay glesDisplay;  // EGL display
  28. EGLSurface glesSurface;  // EGL rendering surface
  29. EGLContext glesContext;  // EGL rendering context
  30. GLuint texture[6] = {0};
  31. // 立方体定点坐标
  32. GLshort vertices[] = {
  33. -1,-1,1,
  34. 1,-1,1,
  35. 1,1,1,
  36. -1,1,1,
  37. -1,-1,-1,
  38. -1,1,-1,
  39. 1,1,-1,
  40. 1,-1,-1,
  41. -1,1,-1,
  42. -1,1,1,
  43. 1,1,1,
  44. 1,1,-1,
  45. -1,-1,-1,
  46. 1,-1,-1,
  47. 1,-1,1,
  48. -1,-1,1,
  49. 1,-1,-1,
  50. 1,1,-1,
  51. 1,1,1,
  52. 1,-1,1,
  53. -1,-1,-1,
  54. -1,-1,1,
  55. -1,1,1,
  56. -1,1,-1
  57. };
  58. // 各个面纹理坐标
  59. GLshort texCoords[] = {
  60. 0,0,1,0,1,1,0,1,
  61. 0,0,1,0,1,1,0,1,
  62. 0,0,1,0,1,1,0,1,
  63. 0,0,1,0,1,1,0,1,
  64. 0,0,1,0,1,1,0,1,
  65. 0,0,1,0,1,1,0,1,
  66. };
  67. // 三角形索引数据
  68. GLbyte indices1[] = {
  69. 0,1,3,2,
  70. 0,0,0,0,
  71. 0,0,0,0,
  72. 0,0,0,0,
  73. 0,0,0,0,
  74. 0,0,0,0
  75. };
  76. GLbyte indices2[] = {
  77. 0,0,0,0,
  78. 4,5,7,6,
  79. 0,0,0,0,
  80. 0,0,0,0,
  81. 0,0,0,0,
  82. 0,0,0,0
  83. };
  84. GLbyte indices3[] = {
  85. 0,0,0,0,
  86. 0,0,0,0,
  87. 8,9,11,10,
  88. 0,0,0,0,
  89. 0,0,0,0,
  90. 0,0,0,0
  91. };
  92. GLbyte indices4[] = {
  93. 0,0,0,0,
  94. 0,0,0,0,
  95. 0,0,0,0,
  96. 12,13,15,14,
  97. 0,0,0,0,
  98. 0,0,0,0
  99. };
  100. GLbyte indices5[] = {
  101. 0,0,0,0,
  102. 0,0,0,0,
  103. 0,0,0,0,
  104. 0,0,0,0,
  105. 16,17,19,18,
  106. 0,0,0,0
  107. };
  108. GLbyte indices6[] = {
  109. 0,0,0,0,
  110. 0,0,0,0,
  111. 0,0,0,0,
  112. 0,0,0,0,
  113. 0,0,0,0,
  114. 20,21,23,22
  115. };
  116. // 此代码模块中包含的函数的前向声明:
  117. ATOM            MyRegisterClass(HINSTANCE, LPTSTR);
  118. BOOL            InitInstance(HINSTANCE, int);
  119. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
  120. BOOL InitOGLES(HWND hWnd);
  121. void CreateSurface();
  122. BOOL LoadTexture(LPCTSTR lpFileName,GLuint *id);
  123. void Render();
  124. void Clean();
  125. int WINAPI WinMain(HINSTANCE hInstance,
  126. HINSTANCE hPrevInstance,
  127. LPTSTR    lpCmdLine,
  128. int       nCmdShow)
  129. {
  130. MSG msg;
  131. // 执行应用程序初始化:
  132. if (!InitInstance(hInstance, nCmdShow))
  133. {
  134. return FALSE;
  135. }
  136. BOOL done = FALSE;
  137. // 主消息循环:
  138. while(!done)
  139. {
  140. if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  141. {
  142. if(msg.message==WM_QUIT)
  143. done = TRUE;
  144. else
  145. {
  146. TranslateMessage(&msg);
  147. DispatchMessage(&msg);
  148. }
  149. }
  150. else
  151. {
  152. Render();
  153. };
  154. }
  155. return (int) msg.wParam;
  156. }
  157. //
  158. //  函数: MyRegisterClass()
  159. //
  160. //  目的: 注册窗口类。
  161. //
  162. //  注释:
  163. //
  164. ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
  165. {
  166. WNDCLASS wc;
  167. wc.style         = CS_HREDRAW | CS_VREDRAW;
  168. wc.lpfnWndProc   = WndProc;
  169. wc.cbClsExtra    = 0;
  170. wc.cbWndExtra    = 0;
  171. wc.hInstance     = hInstance;
  172. wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINCEOPENGLDEMO));
  173. wc.hCursor       = 0;
  174. wc.hbrBackground = (HBRUSH) GetStockObject(NULL_BRUSH);
  175. wc.lpszMenuName  = 0;
  176. wc.lpszClassName = szWindowClass;
  177. return RegisterClass(&wc);
  178. }
  179. //
  180. //   函数: InitInstance(HINSTANCE, int)
  181. //
  182. //   目的: 保存实例句柄并创建主窗口
  183. //
  184. //   注释:
  185. //
  186. //        在此函数中,我们在全局变量中保存实例句柄并
  187. //        创建和显示主程序窗口。
  188. //
  189. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  190. {
  191. HWND hWnd;
  192. g_hInst = hInstance; // 将实例句柄存储在全局变量中
  193. if (!MyRegisterClass(hInstance, szAppName))
  194. {
  195. return FALSE;
  196. }
  197. hWnd = CreateWindow(
  198. szAppName,
  199. szAppName,
  200. WS_VISIBLE,
  201. 0,
  202. 0,
  203. ::GetSystemMetrics(SM_CXSCREEN),
  204. ::GetSystemMetrics(SM_CYSCREEN),
  205. NULL,
  206. NULL,
  207. hInstance,
  208. NULL);
  209. if (!hWnd)
  210. {
  211. return FALSE;
  212. }
  213. if(!InitOGLES(hWnd))
  214. {
  215. printf("InitOGLES failed\n");
  216. return FALSE;
  217. }
  218. CreateSurface();
  219. ShowWindow(hWnd, SW_SHOW);
  220. UpdateWindow(hWnd);
  221. return TRUE;
  222. }
  223. //
  224. //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  225. //
  226. //  目的: 处理主窗口的消息。
  227. //
  228. //  WM_COMMAND  - 处理应用程序菜单
  229. //  WM_PAINT    - 绘制主窗口
  230. //  WM_DESTROY  - 发送退出消息并返回
  231. //
  232. //
  233. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  234. {
  235. PAINTSTRUCT ps;
  236. HDC hdc;
  237. switch (message)
  238. {
  239. case WM_CREATE:
  240. break;
  241. case WM_PAINT:
  242. hdc = BeginPaint(hWnd, &ps);
  243. // TODO: 在此添加任意绘图代码...
  244. EndPaint(hWnd, &ps);
  245. break;
  246. case WM_DESTROY:
  247. {
  248. Clean();
  249. PostQuitMessage(0);
  250. }
  251. break;
  252. default:
  253. return DefWindowProc(hWnd, message, wParam, lParam);
  254. }
  255. return 0;
  256. }
  257. BOOL InitOGLES(HWND hWnd)
  258. {
  259. EGLint matchingConfigs;
  260. EGLint majorVersion = 0;
  261. EGLint minorVersion = 0;
  262. glesDisplay = eglGetDisplay(GetDC(hWnd));  //Ask for an available display
  263. if( glesDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS )
  264. return FALSE;
  265. EGLConfig *configs_list;
  266. EGLint     num_configs;
  267. // Display initialization (we don‘t care about the OGLES version numbers)
  268. if( eglInitialize( glesDisplay, &majorVersion, &minorVersion) == EGL_FALSE)
  269. {
  270. printf("eglInitialize failed, eglGetError = 0x%04x\n",eglGetError());
  271. return FALSE;
  272. }
  273. // find out how many configurations are supported
  274. if ( eglGetConfigs( glesDisplay, NULL, 0, &num_configs)==EGL_FALSE || eglGetError() != EGL_SUCCESS )
  275. return FALSE;
  276. configs_list = (EGLConfig*) malloc(num_configs * sizeof(EGLConfig));
  277. if (configs_list == NULL)
  278. return FALSE;
  279. // Get Configurations
  280. if( eglGetConfigs( glesDisplay, configs_list, num_configs, &num_configs)== EGL_FALSE || eglGetError() != EGL_SUCCESS )
  281. return FALSE;
  282. // Obtain the first configuration with a depth buffer of 16 bits
  283. EGLint attrs[] = {
  284. EGL_RED_SIZE,      5,
  285. EGL_GREEN_SIZE,    6,
  286. EGL_BLUE_SIZE,     5,
  287. EGL_DEPTH_SIZE,   16,
  288. EGL_NONE
  289. };
  290. if (!eglChooseConfig(glesDisplay, attrs, configs_list, num_configs, &matchingConfigs))
  291. {
  292. return eglGetError();
  293. }
  294. // If there isn‘t any configuration enough good
  295. if (matchingConfigs < 1)
  296. return FALSE;
  297. /*eglCreateWindowSurface creates an onscreen EGLSurface and returns
  298. a handle  to it. Any EGL rendering context created with a
  299. compatible EGLConfig can be used to render into this surface.*/
  300. glesSurface = eglCreateWindowSurface(glesDisplay, configs_list[0], hWnd, 0);
  301. if(!glesSurface)
  302. return FALSE;
  303. // Let‘s create our rendering context
  304. glesContext=eglCreateContext(glesDisplay, configs_list[0], 0, 0);
  305. if(!glesContext)
  306. return FALSE;
  307. //Now we will activate the context for rendering
  308. eglMakeCurrent(glesDisplay, glesSurface, glesSurface, glesContext);
  309. /*Remember: because we are programming for a mobile device, we cant
  310. use any of the OpenGL ES functions that finish in ‘f‘, we must use
  311. the fixed point version (they finish in ‘x‘*/
  312. glClearColorx(0, 0, 0, 0);
  313. glShadeModel(GL_SMOOTH);
  314. RECT rc;
  315. GetWindowRect(hWnd, &rc);
  316. UINT width = rc.right - rc.left;
  317. UINT height = rc.bottom - rc.top;
  318. // 设置OpenGL场景的大小
  319. glViewport(rc.left, rc.top, width, height);
  320. // 设置投影矩阵
  321. glMatrixMode(GL_PROJECTION);
  322. glLoadIdentity();
  323. // 投影变换(透视投影)
  324. float ratio = (float) width / height;
  325. glFrustumf(-ratio, ratio, -1, 1, 2, 10);
  326. //glOrthox(FixedFromInt(-50),FixedFromInt(50), FixedFromInt(-50), FixedFromInt(50), FixedFromInt(-50), FixedFromInt(50));
  327. // 选择模型观察矩阵
  328. glMatrixMode(GL_MODELVIEW);
  329. // 重置模型观察矩阵
  330. glLoadIdentity();
  331. return TRUE;
  332. }
  333. void CreateSurface()
  334. {
  335. glDisable(GL_DITHER);
  336. // 告诉系统对透视进行修正
  337. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
  338. // 黑色背景
  339. glClearColor(0, 0, 0, 0);
  340. // 启用阴影平滑
  341. glShadeModel(GL_SMOOTH);
  342. // 设置深度缓存
  343. glClearDepthf(1.0f);
  344. // 启用深度测试
  345. glEnable(GL_DEPTH_TEST);
  346. // 所作深度测试的类型
  347. glDepthFunc(GL_LEQUAL);
  348. // 启用2D纹理
  349. glEnable(GL_TEXTURE_2D);
  350. // 加载纹理
  351. LoadTexture(_T("\\NAND2\\OpenGlRes\\1.png"),&texture[0]);
  352. LoadTexture(_T("\\NAND2\\OpenGlRes\\1.png"),&texture[1]);
  353. LoadTexture(_T("\\NAND2\\OpenGlRes\\1.png"),&texture[2]);
  354. LoadTexture(_T("\\NAND2\\OpenGlRes\\1.png"),&texture[3]);
  355. LoadTexture(_T("\\NAND2\\OpenGlRes\\1.png"),&texture[4]);
  356. LoadTexture(_T("\\NAND2\\OpenGlRes\\1.png"),&texture[5]);
  357. }
  358. void Render()
  359. {
  360. static float rotation = 0;
  361. // 清除屏幕和深度缓存
  362. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  363. glMatrixMode(GL_MODELVIEW);
  364. // 重置当前的模型观察矩阵
  365. glLoadIdentity();
  366. // 坐标变换
  367. glTranslatef(0.0f, 0.0f, -5.0f);
  368. // 设置旋转
  369. glRotatef(rotation++, 0.0f, 1.0f, 0.0f);
  370. glRotatef(rotation++, 1.0f, 0.0f, 0.0f);
  371. glEnableClientState(GL_VERTEX_ARRAY);
  372. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  373. glVertexPointer(3, GL_SHORT, 0, vertices);
  374. glTexCoordPointer(2, GL_SHORT, 0, texCoords);
  375. // 绘制立方体并绑定纹理
  376. glBindTexture(GL_TEXTURE_2D, texture[0]);
  377. glDrawElements(GL_TRIANGLE_STRIP, 4,  GL_UNSIGNED_BYTE, indices1);
  378. glBindTexture(GL_TEXTURE_2D, texture[1]);
  379. glDrawElements(GL_TRIANGLE_STRIP, 8,  GL_UNSIGNED_BYTE, indices2);
  380. glBindTexture(GL_TEXTURE_2D, texture[2]);
  381. glDrawElements(GL_TRIANGLE_STRIP, 12,  GL_UNSIGNED_BYTE, indices3);
  382. glBindTexture(GL_TEXTURE_2D, texture[3]);
  383. glDrawElements(GL_TRIANGLE_STRIP, 16,  GL_UNSIGNED_BYTE, indices4);
  384. glBindTexture(GL_TEXTURE_2D, texture[4]);
  385. glDrawElements(GL_TRIANGLE_STRIP, 20,  GL_UNSIGNED_BYTE, indices5);
  386. glBindTexture(GL_TEXTURE_2D, texture[5]);
  387. glDrawElements(GL_TRIANGLE_STRIP, 24,  GL_UNSIGNED_BYTE, indices6);
  388. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  389. glDisableClientState(GL_VERTEX_ARRAY);
  390. eglSwapBuffers(glesDisplay, glesSurface);
  391. }
  392. void Clean()
  393. {
  394. if(glesDisplay)
  395. {
  396. eglMakeCurrent(glesDisplay, NULL, NULL, NULL);
  397. if(glesContext) eglDestroyContext(glesDisplay, glesContext);
  398. if(glesSurface) eglDestroySurface(glesDisplay, glesSurface);
  399. eglTerminate(glesDisplay);
  400. }
  401. }
  402. BOOL LoadTexture(LPCTSTR lpFileName,GLuint *id)
  403. {
  404. if(!g_Image.Load(lpFileName))
  405. return FALSE;
  406. // 创建纹理
  407. glGenTextures(1, id);
  408. // 绑定纹理
  409. glBindTexture(GL_TEXTURE_2D, *id);
  410. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  411. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  412. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, g_Image.Width(), g_Image.Height(), 0, GL_RGB, GL_UNSIGNED_BYTE, g_Image.GetBmpImage());
  413. g_Image.Free();
  414. return TRUE;
  415. }

以下实现了一个文件加载类,用以将外部图片资源转化成绘制纹理时所需的位图数据。参考代码如下:

[cpp] view plain copy

  1. /********************************************************************
  2. filename:   CImgLoader.h
  3. created:    2011-01-05
  4. author:     firehood
  5. purpose:    文件加载类,将外部图片资源转化成绘制纹理时所需的位图数据
  6. 图片格式支持bmp、png、jpg.
  7. *********************************************************************/
  8. #pragma once
  9. class CImgLoader
  10. {
  11. public:
  12. CImgLoader(void);
  13. ~CImgLoader(void);
  14. public:
  15. // 加载图片资源
  16. BOOL Load(LPCTSTR lpFileName);
  17. // 获取位图数据
  18. unsigned char* GetBmpImage(void);
  19. // 释放图片资源
  20. void Free();
  21. // 获取图像宽度
  22. int Width();
  23. // 获取图像高度
  24. int Height();
  25. private:
  26. int m_Width;                  // 图像宽度
  27. int m_Height;                 // 图像高度
  28. unsigned char *m_pImage;      // 指向图像数据的指针
  29. };
时间: 2024-12-10 01:33:25

opengl 在winCE系统的使用的相关文章

wince系统中对nand坏块的修正

wince系统中对nand坏块的修正 产生坏块的原因是因为NANDFlash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,所以,在NAND 的生产中及使用过程中会产生坏块. 一.坏块的具体表现: 当编程/擦除这个块时,不能将某些位拉高,这会造成Page Program和Block Erase操作时的错误,相应地反映到 Status Register的相应位. 二.坏块的种类: 1.先天性坏块 这种坏块是在生产过程中产生的,一般芯片原厂都会在出厂时都会将坏块第一个p

WIN-CE系统架构

WIN-CE 系统架构分为素部分:硬件层.OEM 层.操作系统层.应用层 http://hovertree.com/hvtart/bjae/oy9pqb94.htm 硬件层: 由CPU .存储器.I/Ok 口等组成嵌入式的硬件系统 OEM 层 是嵌入式硬件与WIN-CE 操作系统的结合层 主要模块: OAL: OEM 适配层,处理EIN-CE 内核与目标硬件设备之间的通信,如CPU 初始化.处理中断.计时器等 BootLoader: 启动加载程序,讲WIN-CE 内核加载到目标硬件系统的内存,并

WinCE 系统下CPU变频

[转自:http://topic.csdn.net/u/20081216/16/e14d9c98-db4c-4b7f-9c97-a5d0c7aa5ef5.html] 在三星的平台上,有个OEMIDLE()函数,实现了降频和恢复回去的方法,你既可以在这里实现降频升频,也可以在OEMinit初始化的时候设置系统频率. 因为主频跟外设是密切相关的,所以你得考虑好和外设的分频比.锁频时间等等,建议这部分用汇编写. 当然了,每个CPU有它的推荐频率的,不可能升太高,而且,升频要电压一并升上去.

WinCE系统深度定制汇总

WinCE应用程序崩溃提示框的处理 WinCE6.0多国语言软键盘 定制WinCE6.0标准界面的一种方法 如何禁用WinCE下的沙漏图标 Silent RNAApp.exe for WinCE6.0 WinCE下自定义的大软键盘 WinCE下定制触摸校准界面的方法 WinCE中公开源代码的编译方法

WinCE 系统刚启动时运行应用,在应用启动时偶尔出现异常

以下是出错时,串口输出的 LOG: ...... Exception 'Data Abort' (0x4): Thread-Id=05fe00b2(pth=c0869000), Proc-Id=053f00be(pprc=c087ba2c) 'MyTest.exe', VM-active=053f00be(pprc=c087ba2c) 'MyTest.exe' PC=4007a930(coredll.dll+0x0006a930) RA=4007a794(coredll.dll+0x0006a7

WinCE 系统下移动存贮设备Storage 的拔插检测

今天在编程检测 Storage(SD/USB) 时,使用了一个消息:WM_DEVICECHANGE 来检测,测试了一下插入/拔出 Storage 设备时确实可以接收到消息. 但后继的处理出现问题:在 Storage 设备拔出时,立刻调用 FindFirstStore/FindNextStore 和 FindFirstPartition/FindNextPartition 时正常: 但在 Storage 设备插入时,立刻调用 FindFirstStore/FindNextStore 和 FindF

c# 编程修改 wince 系统时间

[StructLayout(LayoutKind.Sequential)] public struct SYSTEMTIME { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds;

.NET WinForm程序,WinCE系统下,用Xenocode Postbuild混淆之后,DataGrid绑定List无法显示

解决方法:将List转为DataTable,然后绑定到DataGrid,即可解决. 1 /// <summary> 2 /// 将集合类转换成DataTable 3 /// </summary> 4 /// <param name="list">集合</param> 5 public static DataTable ToDataTable(IList list) 6 { 7 DataTable result = new DataTabl

windows mobile ,wince 系统,用代码启动cab文件安装

有时候需要用代码来启动安装cab,以下是代码.不能实现静默安装. 启动后会提示用户是否安装,需要用户点击是才行. using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.IO; using System.Diagnostics; using System.Windows.Forms; public class BLLI