原帖地址:http://www.cevx.com/bbs/viewthread.php?tid=11343&highlight=opengl
在vxworks下進行OpenGL編程的環境搭建
一、前言
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了
轉自Tony嵌入式論壇,地址:http://www.cevx.com/bbs/thread-11343-1-1.html