跳过正文

VxWorks下编译运行Mesa OpenGL入门教程

·591 字·3 分钟
VxWorks Mesa OpenGL WindML Tornado 3D图形 嵌入式OpenGL Uglteapot SIMNT
目录

VxWorks下编译运行Mesa OpenGL入门教程

一、前言
#

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

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

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

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

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

风河对于 Mesa 的支持貌似在 5.0 就停止更新了,现在 Mesa 7.0.2 中关于 WindML 中跑 3D 的代码还是很多年前的。

但对于入门 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:\Tornado2.2\target\src 下。

3.1 创建工程并添加源文件
#

在 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 下)

3.2 准备头文件
#

C:\Tornado2.2\target\h 下建立 GL 文件夹(存放 OpenGL 头文件)。

将以下文件从 C:\Tornado2.2\target\src\Mesa\include\ 拷贝到刚建立的 GL 文件夹下:

  • gl.h
  • glext.h
  • glu.h
  • osmesa.h
  • uglglutshapes.h
  • uglmesa.h

3.3 配置工程并编译
#

  1. 更改 Tornado 工程 Builds 选项卡中的 C/C++ Compiler 选项,添加 include path:
C:\Tornado2.2\target\src\Mesa\include
C:\Tornado2.2\target\src\Mesa\src
  1. 更改 Rules 选项卡,改为 archive(生成 .a 文件)。

  2. 编译工程。编译成功后会在工程目录下生成 .a 文件。

四、建立一个 VxWorks 工程
#

4.1 新建基于 simpc BSP 的 VxWorks 工程
#

将 WindML 的以下组件包含到 VxWorks:

  • complete 2D 图形库
  • simulator host devices
  • Simulator graphics

4.2 编译 VxWorks
#

如果对这一步不熟悉,可以搜索论坛中关于 WindML 的安装及编译相关文章,这里不再赘述。

五、运行 DEMO 程序
#

  1. 建立一个可下载工程(基于 SIMNTgnu 工具链)。
  2. uglteapot 为例,将以下文件添加到工程:
C:\Tornado2.2\target\src\Mesa\windmldemos\uglteapot.c
  1. 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);
}
  1. 更改 Tornado 工程 Builds 选项卡中的 Macros 选项。
    PRJ_LIBS 中把生成的 .a 路径添加进去。

    示例:

C:/Tornado2.2/target/proj/MesaLib/SIMNTgnu/MesaLib.a
  1. 编译工程,生成 .out 文件。
  2. 运行刚才生成的 VxWorks。
  3. 开启一个 Shell,下载 .out 文件。
  4. 在 Shell 下输入命令:
uglteapot

运行结果说明
#

  • 可按左右键旋转茶壶
  • K 键打开/关闭光照
  • ESC 退出

也可在 VMware 下的 VxWorks 中测试 DEMO。

注意

  • 由于不支持双缓冲,图形显示时会有一些问题。
  • 在 simpc 下显示正常,但速度较慢。

六、总结
#

环境搭建好后,大家可以参考 DEMO 里的流程来写自己的 Demo,学习 OpenGL。

相关文章

VxWorks WindML 安装与配置教程
·103 字·1 分钟
VxWorks WindML Tornado 嵌入式GUI Ugldemo PC Pentium 多媒体库 图形配置
VxWorks下WindML相关知识和图形设备驱动程序开发
·955 字·5 分钟
VxWorks WindML SDK DDK 嵌入式GUI 多媒体库 Tornado 图形驱动 配置工具
VxWorks 6.8 安装配置 Qt 4.8.3 详细教程
·617 字·3 分钟
VxWorks Qt 嵌入式开发 VxWorks 6.8 Qt 4.8.3 Vxsim WindML 交叉编译 嵌入式GUI