一、前言

OpenGL著名的API,其主要作用是依据照相机的设置,将指定图元绘制到帧缓冲中去。

Mesa 是OpenGL的一个具体实现,目前版本是7.0.2

DRI 是直接渲染架构(Direct Render Infrustructure)。包含了诸如ATI r300显卡的子项目

Mesa原先是为UNIX/X11设计的,Mesa对于OpenGL的实现是纯软件的,不含硬件加速,所以跑3D图形时帧率低。

DRI提供了一个安全的接口,让Mesa(以及其他OpenGL实现)可以安全的使用显卡提供的硬件加速功能。

风河对于Mesa的支持貌似在5.0就停止更新了,现在Mesa7.0.2中关于windml中跑3D的代码还是N年以前的

但对于入门OPENGL,学习空间、投影变换,光照,纹理,显示列表等概念这已经足够了

所以写这个帖子只是让大家知道如何在vxworks下开始步入OPENGL世界,学习OPENGL基本概念

而要真正开发应用程序,就一定要用DRI了,这就不在本文范围内了

二、准备工作

我的开发环境是

  • Tornado 2.2
  • VxWorks 5.5
  • WindML 3.0
  • Mesa 4.0(后面提供下载)

三、编译Mesa for WindML 3D图形库

下载MESA 4.0后,解压到c:\Tornado 2.2\target\src下,目录结构如图所示

在Tornado下,建立一个可下载工程,基于SIMNTgnu的,然后添加以下所有的源文件到你的工程,不要漏哦



  #### GL #####
  (最主要的图形库)
  GL_SOURCES = \
  api_arrayelt.c \(在C:\Tornado2.2\target\src\Mesa\src下)
  api_loopback.c \
  api_noop.c \
  api_validate.c \
  accum.c \
  attrib.c \
  blend.c \
  buffers.c \
  clip.c \
  colortab.c \
  config.c \
  context.c \
  convolve.c \
  debug.c \
  depth.c \
  dispatch.c \
  dlist.c \
  drawpix.c \
  enable.c \
  enums.c \
  eval.c \
  extensions.c \
  feedback.c \
  fog.c \
  get.c \
  glapi.c \
  glthread.c \
  hash.c \
  hint.c \
  histogram.c \
  image.c \
  imports.c \
  light.c \
  lines.c \
  matrix.c \
  mem.c \
  mmath.c \
  pixel.c \
  points.c \
  polygon.c \
  rastpos.c \
  state.c \
  stencil.c \
  texformat.c \
  teximage.c \
  texobj.c \
  texstate.c \
  texstore.c \
  texutil.c \
  varray.c \
  vtxfmt.c \
  X86/x86.c \(C:\Tornado2.2\target\src\Mesa\src\X86下)
  X86/common_x86.c \
  X86/3dnow.c \
  X86/sse.c \
  math/m_debug_clip.c \(C:\Tornado2.2\target\src\Mesa\src\math下)
  math/m_debug_norm.c \
  math/m_debug_vertex.c \
  math/m_debug_xform.c \
  math/m_eval.c \
  math/m_matrix.c \
  math/m_translate.c \
  math/m_vector.c \
  math/m_vertices.c \
  math/m_xform.c \
  array_cache/ac_context.c \(C:\Tornado2.2\target\src\Mesa\src\array_cache下)
  array_cache/ac_import.c \
  swrast/s_aaline.c \(C:\Tornado2.2\target\src\Mesa\src\swrast下)
  swrast/s_aatriangle.c \
  swrast/s_accum.c \
  swrast/s_alpha.c \
  swrast/s_alphabuf.c \
  swrast/s_bitmap.c \
  swrast/s_blend.c \
  swrast/s_buffers.c \
  swrast/s_copypix.c \
  swrast/s_context.c \
  swrast/s_depth.c \
  swrast/s_drawpix.c \
  swrast/s_feedback.c \
  swrast/s_fog.c \
  swrast/s_histogram.c \
  swrast/s_imaging.c \
  swrast/s_lines.c \
  swrast/s_logic.c \
  swrast/s_masking.c \
  swrast/s_pb.c \
  swrast/s_pixeltex.c \
  swrast/s_points.c \
  swrast/s_readpix.c \
  swrast/s_scissor.c \
  swrast/s_span.c \
  swrast/s_stencil.c \
  swrast/s_texture.c \
  swrast/s_texstore.c \
  swrast/s_triangle.c \
  swrast/s_zoom.c \
  swrast_setup/ss_context.c \
  swrast_setup/ss_triangle.c \
  swrast_setup/ss_vb.c \
  tnl/t_array_api.c \(C:\Tornado2.2\target\src\Mesa\src\tnl下)
  tnl/t_array_import.c \
  tnl/t_context.c \
  tnl/t_eval_api.c \
  tnl/t_imm_alloc.c \
  tnl/t_imm_api.c \
  tnl/t_imm_debug.c \
  tnl/t_imm_dlist.c \
  tnl/t_imm_elt.c \
  tnl/t_imm_eval.c \
  tnl/t_imm_exec.c \
  tnl/t_imm_fixup.c \
  tnl/t_pipeline.c \
  tnl/t_vb_fog.c \
  tnl/t_vb_light.c \
  tnl/t_vb_normals.c \
  tnl/t_vb_points.c \
  tnl/t_vb_render.c \
  tnl/t_vb_texgen.c \
  tnl/t_vb_texmat.c \
  tnl/t_vb_vertex.c
  ##### UGL #####
  UGL_SOURCES = \
  windml/ugl_api.c \(C:\Tornado2.2\target\src\Mesa\src\windml下)
  windml/ugl_dd.c \
  windml/ugl_span.c \
  windml/ugl_line.c \
  windml/ugl_tri.c \
  windml/tornado/torMesaUGLInit.c(C:\Tornado2.2\target\src\Mesa\src\windml\tornado下)
  ##### OS #####
  OS_SOURCES = \
  OSmesa/osmesa.c \(C:\Tornado2.2\target\src\Mesa\src\OSmesa下)
  windml/tornado/torMesaOSInit.c(C:\Tornado2.2\target\src\Mesa\src\windml\tornado下)
  ##### GLUTSHAPES #####
  GLUTSHAPES_SOURCES = \
  windml/ugl_glutshapes.c \(C:\Tornado2.2\target\src\Mesa\src\windml下)
  windml/tornado/torGLUTShapesInit.c(C:\Tornado2.2\target\src\Mesa\src\windml\tornado下)
  ##### GLU #####
  GLU_SOURCES = \
  glu.c \(在C:\Tornado2.2\target\src\Mesa\src-glu下)
  mipmap.c \
  nurbs.c \
  nurbscrv.c \
  nurbssrf.c \
  nurbsutl.c \
  polytest.c \
  project.c \
  quadric.c \
  tess.c \
  tesselat.c \
  ../src/windml/tornado/torMesaGLUInit.c(在C:\Tornado2.2\target\src\Mesa\src\windml\tornado下)

然后在C:\Tornado2.2\target\h下建立GL文件夹(存放OPENGL头文件的)

把C:\Tornado2.2\target\src\Mesa\include\下的gl.h、glext.h、glu.h、osmesa.h、uglglutshapes.h、uglmesa.h拷贝到刚建立的GL文件夹下

做完以上工作后,更改Tornado工程Builds选项卡中的c/c++ compiler选项,添加include path...

添加以下路径


  C:\Tornado2.2\target\src\Mesa\include
  C:\Tornado2.2\target\src\Mesa\src

再更改Rules选项卡,改为archive,即生成.a文件

然后可以编译了,编译成功后会在你工程目录下生成.a

四、建立一个vxworks的工程

新建一个基于simpc BSP的vxworks工程

把windml的complete 2D图形库和simulator host devices,Simulator graphics组件包含到vxworks

编译你的vxworks

如果不清楚这一步的,论坛里可以搜关于WINDML的安装及编译,这里就不多说了

五、运行DEMO程序

建立一个可下载的工程,基于SIMNTgnu工具链的

以uglteapot为例

将C:\Tornado2.2\target\src\Mesa\windmldemos下的uglteapot.c添加到工程

把taskSpawn中的UGL_FALSE修改为UGL_TRUE,如下


  void uglteapot (void)
  {
  taskSpawn ("tTeapot", 210, VX_FP_TASK, 100000, (FUNCPTR)windMLTeapot,
  UGL_TRUE,1,2,3,4,5,6,7,8,9);
  }

更改Tornado工程Builds选项卡中Marcos选项

在PRJ_LIBS中把生成的.a路径添加进去

我的是C:/Tornado2.2/target/proj/MesaLib/SIMNTgnu/MesaLib .a

然后编译工程,生成.out

运行刚才生成的vxworks

开启一个shell

下载.out

在shell下输入命令uglteapot

以下是运行结果

可以按左右键旋转茶壶,按K键打开关闭光照1等

按ESC是退出

再帖几张运行的DEMO截图

六、总结

也可以在vmware下的vxworks下测试你的DEMO

不过由于不支持双缓,图形显示时有点问题

在simpc下显示倒是很正常,不过速度很慢就是

环境搭建好了

大家可以参考DEMO里的流程来写自己的demo学习OPENGL了