社区
机器视觉
帖子详情
请问:如何在linux下搭建opengl开发平台?
BuleFreezing
2003-12-12 05:59:34
如何在linux下搭opengl开发平台?windwos下的dx有专门的sdk,那么linux下有没有opengl的sdk?有没有关于搭建这个平台的文档?谢谢解答!
...全文
710
5
打赏
收藏
请问:如何在linux下搭建opengl开发平台?
如何在linux下搭opengl开发平台?windwos下的dx有专门的sdk,那么linux下有没有opengl的sdk?有没有关于搭建这个平台的文档?谢谢解答!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
goldcattle
2003-12-14
打赏
举报
回复
其实建议长去NEHE的网站去看看,因为他的网站上面提供的opengl都有一份linux下的代码
uuq
2003-12-13
打赏
举报
回复
好,好,应该多多发表在liunx上的东西,有没有在liunx上实际应用有按例
goldcattle
2003-12-13
打赏
举报
回复
2.4 一个更有代表性的例子
下面我们来看一个稍稍复杂的例子。我们绘制一个平面,用户的左键点击被自动连接成一个多边形。当用户点击右键,会弹出菜单供用户选择。用户可以选择清除、镶嵌和退出。选择清除将回到初始状态;选择镶嵌程序自动对多边形进行三角剖分;选择退出则终止程序。(见图二、图三和图四)
图二 图三 图四
/* tessdemo.c 多边形镶嵌的例子,使用函数gluTessCallback和函数gluTessVertex。*/
#include
#include
#include
#include
/* 定义允许的最大多边形数、多边形允许的最大顶点数和可镶嵌的最大三角形数*/
#define MAX_POINTS 256
#define MAX_CONTOURS 32
#define MAX_TRIANGLES 256
/* 用于菜单选项的枚举类型 */
typedef enum{ QUIT, TESSELATE, CLEAR } menu_entries;
static mode_type mode;
/* 定义绘制模式的枚举类型 */
typedef enum{ DEFINE, TESSELATED } mode_type;
static int menu;
static GLsizei width, height; /* OpenGL窗口的大小 */
static GLuint contour_cnt; /* 记录多边形数目 */
static GLuint triangle_cnt; /* 记录三角形数目 */
static GLuint list_start; /* 用于显示列表 */
/* 多边形结构 */
static struct {
GLfloat p[MAX_POINTS][2];
GLuint point_cnt;
} contours [ MAX_CONTOURS ] ;
/* 三角形结构 */
static struct {
GLsizei no;
GLfloat p [3] [2];
GLclampf color [3] [3];
} triangles [ MAX_TRIANGLES ];
/* 窗口大小改变时,设定width和height值,用于重新绘制网格 */
void set_screen_wh ( GLsizei w, GLsizei h )
{ width = w; height = h; }
void tesse ( void )
{ /* 镶嵌函数,调用gluTess* 函数实现*/ }
/* 对点击鼠标左键事件的响应函数:更新当前多边形顶点数组,并重新绘制 */
void left_down ( int x1, int y1 )
{
GLfloat P[2];
GLuint point_cnt;
/* 将GLUT窗口坐标变换为GL坐标:前者(0,0)在左上角而后者在左下角*/
P[0] = x1; P[1] = height - y1;
/* 更新顶点数据 */
point_cnt = contours [ contour_cnt ] . point_cnt;
contours [ contour_cnt ] . p [ point_cnt ][ 0 ] = P [ 0 ];
contours [ contour_cnt ]. p [ point_cnt ] [ 1 ] = P [ 1 ];
/* 绘制新添加的边,若为第一个点,则绘制一个点 */
glBegin ( GL_LINES );
if ( point_cnt ) {
glVertex2fv ( contours[contour_cnt].p[point_cnt-1] );
glVertex2fv ( P );
}
else {
glVertex2fv ( P );
glVertex2fv ( P );
}
glEnd();
glFinish();
contours[contour_cnt].point_cnt++;
}
/* 点击鼠标中键的响应事件,有些系统可以用同时点击左右键模拟:结束一个多边形 */
void middle_down( int x1, int y1 )
{
GLuint point_cnt;
(void) x1;
(void) y1;
point_cnt = contours[contour_cnt].point_cnt;
/* 连接起始点和最后一个点,构成一个完整的多边形 */
if ( point_cnt > 2 )
{
glBegin( GL_LINES );
glVertex2fv( contours[contour_cnt].p[0] );
glVertex2fv( contours[contour_cnt].p[point_cnt-1] );
contours[contour_cnt].p[point_cnt][0] = -1;
glEnd();
glFinish();
contour_cnt++;
contours[contour_cnt].point_cnt = 0;
}
}
/* 处理鼠标响应的函数,根据按键的类型调用不同的函数:左键和中键。 */
void mouse_clicked( int button, int state, int x, int y )
{
/* 将OpenGL的像素坐标换为背景的网格坐标,背景网格为边长为10的小正方形 */
x -= x%10;
y -= y%10;
switch ( button ) {
case GLUT_LEFT_BUTTON: /* GLUT发现左键被点击 */
if ( state == GLUT_DOWN ) {
left_down( x, y );
}
break;
case GLUT_MIDDLE_BUTTON: /* 中键被点击 */
if ( state == GLUT_DOWN ) {
middle_down( x, y );
}
break;
}
}
/* OpenGL绘制函数,有两种模式 */
void display( void )
{
GLuint i,j;
GLuint point_cnt;
glClear( GL_COLOR_BUFFER_BIT );
switch ( mode )
{
case DEFINE: /* 多边形定义阶段 */
/* 绘制网格,单个网格大小为10像素,网格数目取决于OpenGL窗口大小 */
glColor3f ( 0.6, 0.5, 0.5 );
glBegin ( GL_LINES );
for ( i = 0 ; i < width ; i += 10 ){
for ( j = 0 ; j < height ; j += 10 ) {
glVertex2i ( 0, j );
glVertex2i ( width, j );
glVertex2i ( i, height );
glVertex2i ( i, 0 );
}
}
/* 绘制多边形 */
glColor3f( 1.0, 1.0, 0.0 );
for ( i = 0 ; i <= contour_cnt ; i++ ) {
point_cnt = contours[i].point_cnt;
glBegin( GL_LINES );
switch ( point_cnt ) {
case 0:
break;
case 1:
glVertex2fv ( contours[i].p[0] );
glVertex2fv ( contours[i].p[0] );
break;
case 2:
glVertex2fv( contours[i].p[0] );
glVertex2fv( contours[i].p[1] );
break;
default:
--point_cnt;
for ( j = 0 ; j < point_cnt ; j++ ) {
glVertex2fv ( contours [ i ]. p [ j ] );
glVertex2fv ( contours [ i ] .p [ j+1 ] );
}
if ( contours [ i ].p [ j+1 ] [ 0 ] == -1 )
{
glVertex2fv ( contours [ i ]. p [ 0 ] );
glVertex2fv ( contours [ i ] .p [ j ] );
}
break;
}
glEnd();
}
glFinish();
break;
case TESSELATED: /* 绘制镶嵌后的多边形,显示列表由函数tesse()给出 */
glColor3f( 0.7, 0.7, 0.0 );
glCallList( list_start );
glLineWidth( 2.0 );
glCallList( list_start + 1 );
glLineWidth( 1.0 );
glFlush();
break;
}
glColor3f( 1.0, 1.0, 0.0 );
}
/* 菜单选项clear的响应函数,将所有变量清零,绘制模式设为DEFINE */
void clear( void )
{
contour_cnt = 0;
contours[0].point_cnt = 0;
triangle_cnt = 0;
mode = DEFINE;
glDeleteLists( list_start, 2 );
list_start = 0;
}
/* 菜单选项quit的响应函数,退出程序 */
void quit( void )
{
exit( 0 );
}
/* 定义菜单的响应函数 */
void menu_selected( int entry )
{
switch ( entry ) {
case CLEAR:
clear ( );
break;
case TESSELATE:
tesse ( );
break;
case QUIT:
quit ( );
break;
}
/* 选择菜单后重绘OpenGL窗口 */
glutPostRedisplay();
}
/* 定义快捷键响应函数 */
void key_pressed( unsigned char key, int x, int y )
{
/* 在此例子中,不需要用表明鼠标位置的变量x和y */
( void ) x; ( void ) y;
/* 针对不同按键,定义动作 */
switch ( key ) {
case 'c':
case 'C':
clear();
break;
case 't':
case 'T':
tesse();
break;
case 'q':
case 'Q':
quit();
break;
}
/* 按键后重绘窗口 */
glutPostRedisplay();
}
/* 执行一些程序的初始化过程 */
void myinit( void )
{
/* 设置窗口背景颜色*/
glClearColor( 0.4, 0.4, 0.4, 0.0 );
glShadeModel( GL_FLAT );
glPolygonMode( GL_FRONT, GL_FILL );
/* 创建一个菜单,并定义菜单项及该菜单对应的响应函数 */
menu = glutCreateMenu( menu_selected );
glutAddMenuEntry( "clear", CLEAR );
glutAddMenuEntry( "tesselate", TESSELATE );
glutAddMenuEntry( "quit", QUIT );
/* 定义菜单动作方式:点击右键弹出 */
glutAttachMenu( GLUT_RIGHT_BUTTON );
/* 注册鼠标事件响应函数 */
glutMouseFunc( mouse_clicked );
/* 注册键盘事件响应函数 */
glutKeyboardFunc( key_pressed );
contour_cnt = 0;
mode = DEFINE;
}
/* 定义窗口大小改变时的响应 */
static void reshape( GLsizei w, GLsizei h )
{
glViewport( 0, 0, w, h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
set_screen_wh( w, h );
}
int main( int argc, char **argv )
{
/* 创建窗口 */
glutInit ( & argc, argv );
glutInitDisplayMode ( GLUT_SINGLE | GLUT_RGB );
glutInitWindowSize ( 400, 400 );
glutCreateWindow( argv[0] );
myinit();
glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutMainLoop();
return 0;
}
goldcattle
2003-12-13
打赏
举报
回复
2.2 一个简单的例子
下面,我们先看一个简单的例子。这个例子画一个立体的球。
/* light.c
此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
*/
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
# include < GL / glut.h >
# include < stdlib.h >
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
void init ( void )
{
GLfloat mat_specular [ ] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess [ ] = { 50.0 };
GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };
glClearColor ( 0.0, 0.0, 0.0, 0.0 );
glShadeModel ( GL_SMOOTH );
glMaterialfv ( GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv ( GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv ( GL_LIGHT0, GL_POSITION, light_position);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
}
/*调用GLUT函数,绘制一个球*/
void display ( void )
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere (1.0, 40, 50);
glFlush ();
}
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ( );
if (w <= h)
glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w,
1.5 * ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 );
else
glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h,
1.5 * ( GLfloat ) w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity ( ) ;
}
/* 定义对键盘的响应函数 */
void keyboard ( unsigned char key, int x, int y)
{
/*按Esc键退出*/
switch (key) {
case 27:
exit ( 0 );
break;
}
}
int main(int argc, char** argv)
{
/* GLUT环境初始化*/
glutInit (&argc, argv);
/* 显示模式初始化 */
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
/* 定义窗口大小 */
glutInitWindowSize (300, 300);
/* 定义窗口位置 */
glutInitWindowPosition (100, 100);
/* 显示窗口,窗口标题为执行函数名 */
glutCreateWindow ( argv [ 0 ] );
/* 调用OpenGL初始化函数 */
init ( );
/* 注册OpenGL绘图函数 */
glutDisplayFunc ( display );
/* 注册窗口大小改变时的响应函数 */
glutReshapeFunc ( reshape );
/* 注册键盘响应函数 */
glutKeyboardFunc ( keyboard );
/* 进入GLUT消息循环,开始执行程序 */
glutMainLoop( );
return 0;
}
从上面的例子中我们可以看出,GLUT采用一种函数注册的机制来实现OpenGL绘图。它的一般流程正如我们上面的注释所写,先是初始化函数,定义窗口,然后执行OpenGL初始化程序,这主要是一些需要全局设置的环境变量。接下来是注册相应事件的函数,包括完成实际绘图工作的绘制程序、改变OpenGL窗口大小时的响应函数、键盘事件的响应函数和鼠标时间的响应函数。最后调用glutMainLoop()函数,执行在glutReshapeFunc和glutDisplayFunc中注册的函数,进入消息循环。当用户通过键盘和鼠标进行交互操作时,它即调用相应的函数。
我们编译上面的名为light.c的源文件。假定头文件(目录GL)放在目录/usr/local/include下,库文件(动态库libGL.so.*、libGLU.so.*和libglut.so.*)在目录/usr/local/lib目录下,并已经运行了ldconfig,则编译命令为:
gcc -I/usr/local/include -L/usr/local/lib -L/usr/X11R6/lib -lglut -lGLU -lGL
-lX11 -lXext -lXmu -lXi -lm light.c -o light
其中的-lX11 -lXert -lXi -lm 是绘制窗口需要的X的库,它们默认在 /usr/X11R6/lib目录下。下面的图一即是运行light的结果,当按下ESC键时,程序会退出。调整窗口大小时,图形自动重绘。注意在上面reshape函数中,比较w和h的值给出的取景变换,这是一个常用的技巧。
图一
2.3 GLUT简介
GLUT常用的函数主要包括以下几类:
· 初始化函数。主要就是上面例子中的几个函数。
· 消息循环函数。即glutMainLoop函数。
· 窗口管理函数。包括窗口的创建、修改、删除等。GLUT支持多个OpenGL窗口。
· Overlay管理函数。当用户显卡支持Overlay方式时,可以用这些函数来创建、管理、删除GLUT窗口的Overlay。
· 菜单管理函数。定制菜单以及定义菜单相应事件。
· 事件注册函数。除了上面例子中提及的外,还有鼠标、空间球(提供三维操作的装备)、特殊键(Ctrl、Shift、F系列键、方向键)等设备的事件注册函数。
· 字体绘制函数。用多种字体、字号供选择。
· 简单几何体的绘制程序。包括球、立方体、锥体、圆环体、十二面体、八面体、四面体、二十面体和茶壶。每种几何体都有实体和虚线两个选项。
· 取状态函数。类似OpenGL的glGet系列函数,取得GLUT的各种状态值。
· 颜色索引表函数。
这些函数极大的方便了用户的OpenGL编程。下面我们简略介绍一下几个常用的函数。
· glutPostRedisplay()。发送消息给函数glutMainLoop,请求重绘本窗口。利用此函数可以实现动画。例如在上面的例子中,我们添加一个全局变量:float move=0.0。并定义函数MoveSphere如下:
void MoveSphere ( void )
{
for(int i=0;i<100;i++){
if ( move<1.0) move+=0.1;
else move=0.0;
glutPostRedisplay ( );
}
}
同时修改函数display()为:
void display ( void )
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef ( move, 0.0, 0.0);
glutSolidSphere (1.0, 40, 50);
glFlush ();
}
这样,当我们执行函数MoveSphere时,就会看到上面的球从中间向右移动一段距离,然后又回到中心,继续移动。
· glutIdleFunc()函数。这个函数注册一个空闲程序一直在后台运行。我们将上面的MoveSphere函数加以修改,去掉循环,然后在light.c程序的glutMainLoop()函数调用前添加一行代码:glutIdleFunc (MoveSphere);这样我们不需要直接调用函数MoveSphere,程序一运行,它就被反复调用直到我们退出程序为止,这和我们前一版本中它只能循环特定的步数不一样。
· glutTimerFunc()函数。和前面的glutIdleFunc()函数类似,但不同的是它注册的函数每隔特定的事件发生。时间的单位是毫秒。
· glutBitmapCharacter()函数。用位图方式按指定的字体绘制一个字符串。
· glutSolidSphere()函数。这是绘制几何体类函数中的一个。此函数绘制一个球体。
goldcattle
2003-12-13
打赏
举报
回复
OpenGL是一个工业标准的三维计算机图形软件接口,它由SGI公司发布并广泛应用于Unix、OS/2、Windows/NT等多种平台,当然也包括Linux。在Windows/NT平台上,一般的开发工具如VC、BC、Fortran Powerstation等都支持直接的OpenGL应用的开发;在商用Unix平台上,Motif同样很好的支持OpenGL(毕竟OpenGL最初是工作站上的东西);那么在Linux上呢?
本文不着力于OpenGL编程的方法和技巧,而是把重点放在如何在Linux平台上开发OpenGL程序。介绍支持OpenGL的几个工具包,并辅以详细的实例来阐述。
1. Linux下OpenGL编程环境简介
OpenGL不是自由软件,它的版权、商标(OpenGL这个名字)都归SGI公司所有。但在Linux下有OpenGL的取代产品:Mesa。Mesa提供和OpenGL几乎完全一致的接口,对利用OpenGL API编程的人来说,几乎感觉不到任何差异。Mesa是遵循GPL协议(部分遵循LGPL协议)的自由软件,而且,正是由于Mesa的自由性,它在对新硬件的支持度等方面都超过了OpenGL。Mesa可以从www.mesa3d.org取得。得到Mesa后,依照说明即可生成编写程序所需要的动态、静态连接库和头文件。
了解OpenGL的读者都知道,OpenGL本身只提供三维图形接口,不具备绘制窗口、接受响应、处理消息等功能。这些功能必须由第三方的开发环境提供,如上面提及的VC等等。有人会想,既然在Motif下可以开发OpenGL程序,那么,使用Linux下的Lesstif也应该可以。是的,的确可以,但不幸的是,Linux下的Lesstif是一个很不成熟的产品,而且也不具有可移植性,所以应用Lesstif开发的人很少。下面我们简单介绍几个常用的工具包。
在Linux下开发OpenGL程序,最常用的工具是GLUT(The OpenGL Utility Toolkit)。它可以创建一个或多个OpenGL窗口,响应、处理用户的交互操作、简单的弹出式菜单以及一些内置的绘图和字体处理功能。GLUT和OpenGL一样,可以移植于多种平台。由于它良好的表现,现在它已经成为Mesa发布的标准套件之一。
另一个很好的开发工具包是FLTK(Fast Light Tool Kit),这是一个用C++编写的图形界面开发工具。和GTK++、KDE不同,它只关注于图形界面的设计,而尽量不牵涉其他的实际应用。这个特点使得它比其他许多开发工具简练和高效。而且,它同样也是一个具有良好移植性的开发工具。事实上,它现在正引来越来越多人的兴趣,许多商业软件(尤其是致力于开发嵌入式桌面系统的软件)都选用了它作为图形界面的开发工具。关于它的详细情况参见作者的另一篇文章《FLTK---一个优秀的图形界面开发工具包》。在FLTK里有一个组件:Fl_Gl_Window是专门的OpenGL窗口,利用它开发OpenGL程序相当方便。
最后要提的是GTK和KDE,它们是目前在Linux下用的最多的开发工具。GTK本身并不直接支持OpenGL(新的版本是否支持,尚不太清楚),但有人开发了支持OpenGL的Widget,叫做GLAREA,需要的读者可以到网上去查找或者与本文作者联系。KDE提供了对OpenGL的支持,但它的缺陷之一是KDE只运行于Linux系统,不具有可移植性。在这里,我将主要向大家介绍前面两个工具包。
2. 用GLUT开发OpenGL程序
2.1 如何获得
GLUT可以从Mesa中获得,读者也可以直接到它的主页去下载它: http://reality.sgi.com/employees/mjk_asd/glut3/glut3.html。按照说明安装后在OpenGL的头文件GL目录下将会有GLUT的头文件glut.h,同时安装的还有库文件libglut.a或libglut.so。有了它们以后,就可以用GLUT来编程了。
2.2 一个简单的例子
下面,我们先看一个简单的例子。这个例子画一个立体的球。
/* light.c
此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
*/
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
#
[14本经典Android
开发
教程]-13-Android
开发
环境
搭建
步骤详细图解
- **Android** 是由Google在2007年11月5日宣布的基于
Linux
平台
的开源手机操作系统。该系统包括操作系统、中间件、用户界面以及应用软件等几个主要组成部分,被誉为首款真正开放且完整的移动软件解决方案。 - Android...
14天学会Android
开发
飞龙整理 20141005
"Android
开发
基础知识点" 以下是从给定的文件中生成的相关知识点: 一、Android是什么? * Android是一个针对移动设备的操作系统和软件
平台
* 基于
Linux
内核,由Google和开放手机联盟OHA
开发
* 允许使用Java语言...
新版Android
开发
教程.rar
的 Android SDK 提供了在 Android
平台
上使用 JaVa 语言进行 Android 应用
开发
必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
Android技术内幕.系统卷(扫描版)
1.3.1 应用
开发
环境
搭建
/23 1.3.2 源码
开发
环境
搭建
/26 1.4 android源码结构 /32 1.5 小结 /33 第2章 android的内核机制和结构剖析 /34 2.1
linux
与android的关系 /35 .2.1.1 为什么会选择
linux
/35 2.1.2 android...
Linux
环境下
搭建
OpenGL
编程环境
通过按照上述步骤,您可以在
Linux
环境下
搭建
OpenGL
编程环境,并运行简单的
OpenGL
程序。您可以根据需要修改和扩展示例代码,
开发
更复杂的
OpenGL
应用。在
Linux
操作系统下进行
OpenGL
编程,需要
搭建
相应的
开发
环境。本文...
机器视觉
4,503
社区成员
15,370
社区内容
发帖
与我相关
我的任务
机器视觉
图形图像/机器视觉
复制链接
扫一扫
分享
社区描述
图形图像/机器视觉
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章