一、前言
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了