一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 5106|回复: 4

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑 * S% H* ], R! e+ R
0 }- m# g, }: h8 A# V4 a. X. l) O

OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的应用程序接口(API)的规格,它用于生成二维、三维图像。

开放源代码库Mesa是一个纯基于软件的图形API,它的代码兼容于OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API。因此Linux要用OpenGL,需要装Mesa和freeglut(为什么叫freeglut?不晓得)

执行下面代码即可安装(实验了很多方法,最后才装上的,不知道这两个够不够)


. ~# V' G% f+ g7 m9 q1 n. u

sudo apt-get install freeglut3 freeglut3-dev) \6 V2 L1 q+ L: g" w' ^; @
sudo apt-get install mesa-common-dev mesa-utils

安装完成后测试下如下的代码(人比较懒,直接到百度了段代码)

#include <GL/glut.h>  y! n* b& T1 Y/ p6 U  T) w6 `- `; P+ p
void display(){   
6 ?1 v' F# ?# f4 F5 NglClear(GL_COLOR_BUFFER_BIT);    5 g/ w' @2 F7 O5 q
glBegin(GL_POLYGON);     ; e3 q. e" Y$ y* G
glVertex2f(-0.5,-0.5);     
0 b0 y- F- n! d; M0 k: U* \6 wglVertex2f(-0.5,0.5);     
3 n/ F* K" h2 U6 `glVertex2f(0.5,0.5);     
/ M! Y; Q. A. s3 O" Z6 i% S/ yglVertex2f(0.5,-0.5);    ' Q  k; p6 c8 Z+ L) G, n* J( T
glEnd();   
' L, G! c: A5 e# }# q0 _' GglFlush();$ B# E: j+ c0 U1 X: Z: P$ K
}% w& [9 ]/ k6 b4 z) \8 v. |
& ]8 ]7 u3 m6 @/ G
int main(int argc,char **argv){   0 _$ h, ]% R( x- z/ {, V9 z
glutInit(&argc,argv);   
" K; E, n- v' ~4 A  {7 {" V3 ?) Y glutCreateWindow("Hello,world!");   
- r4 e: y# P: V# f8 B' k$ T5 ? glutDisplayFunc(display);   0 y7 f& Q9 }9 ]. ?7 n; H* C
glutMainLoop();}

将如上代码保存成a.c 后执行如下命令编译程序

gcc++ a.c -o -lGL -lglut

如果出现如下错误,说明OpenGL没有装成功

a.c:1:21: 致命错误: GL/glut.h:没有那个文件或目录编译中断。

如果出现下面的错误

/tmp/ccVGAaqV.o: In function `display':a.c:(.text+0xa): undefined reference to `glClear'a.c:(.text+0x14): undefined reference to `glBegin'a.c:(.text+0x29): undefined reference to `glVertex2f'a.c:(.text+0x3e): undefined reference to `glVertex2f'a.c:(.text+0x53): undefined reference to `glVertex2f'a.c:(.text+0x68): undefined reference to `glVertex2f'a.c:(.text+0x6d): undefined reference to `glEnd'a.c:(.text+0x72): undefined reference to `glFlush'/tmp/ccVGAaqV.o: In function `main':a.c:(.text+0x96): undefined reference to `glutInit'a.c:(.text+0xa0): undefined reference to `glutCreateWindow'a.c:(.text+0xad): undefined reference to `glutDisplayFunc'a.c:(.text+0xb2): undefined reference to `glutMainLoop'collect2: ld 返回 1

有人说是因为OpenGL没有装好,我又是重装freeglut,又是装各种看起来像的库。最后才发现,原来是没有装显卡驱动,囧囧的。所以你要是遇到相同的问题,先检查下显卡驱动是不是装好了。

搞定,终于可以在Linux下使用OpenGL了。考虑到每次编译带有GL的文件都需要加-lGL -lglut的参数比较麻烦,于是在~/.bashrc最后加上如下一行

alias glc="g++ -lGL -lglut"

然后编译的时候之需要像gcc/g++那样编译,执行如下代码就ok了

glc a.c -o a

nice!


/ V, R$ m  Y! x8 L7 z  M0 D* e4 l1 [1 {1 t- P' D, g
: l6 a! \; b4 ^0 F$ @

' j, c# e/ C6 d% g8 U9 p
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果
0 D5 I: L9 j; I6 h
; z4 m. c& R2 @2 t3 d/ Q 2017-01-24 17-27-28屏幕截图.gif + U* J7 G2 y4 @  ^* @, O
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c. I$ E8 n! u+ Q+ i& {! y
  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。$ T& a" F- Q3 m! _( f6 |! _( P4 @* D9 `
*/
: f/ K9 P, a9 c% _; t+ R9 N: o! L7 }0 v/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
: R  R- s/ H2 {; h; @#include<GL/glut.h>. a$ w0 }* U3 @3 H
#include<stdlib.h>  G3 n$ I5 @5 U- g( }1 x

% Z+ M/ [0 H6 c0 m2 i/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
  m2 v1 ^6 M  A3 W& @$ @3 yvoid init(void)
- r) A! ?) Y$ Y3 Y0 P5 H{3 }! n) J  f6 `( i- b1 W6 s
    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};  v2 F2 s8 z, f0 b2 r) L
    GLfloat mat_shininess[] = {50.0};
' a; F9 y% u' a5 B, k' ?    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
3 ^) u( ~3 m3 k7 L) p8 k
5 Q; M" f# c# h4 J    glClearColor(0.0, 0.0, 0.0, 0.0);8 E2 z% P5 h! U  b
    glShadeModel(GL_SMOOTH);! l, c; c2 u- W  q

. I  s" O$ [8 o# U" V! U    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);% K8 ~1 }7 H. ?  r& N
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);( L( Q, b" H! c- ?) V
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
9 Z2 g, q! }& H9 O6 E: p: z* H8 s9 K6 E+ a* z" H
    glEnable(GL_LIGHTING);; k! X' d. I  m+ Y- ~1 c
    glEnable(GL_LIGHT0);+ V8 Y% ?2 ?' p9 L+ }- f* ~' }
    glEnable(GL_DEPTH_TEST);8 D8 n4 |$ N- Z% m$ B: l) g, W
}
, H' W. {# X( \! N% ]- B1 |  r: @/ I9 Z" S% D
/*调用GLUT函数,绘制一个球*/( v* M" O3 M4 u5 A" V2 s5 {, t
void display ( void )
. e: ?/ o( N2 X- N9 S& z{4 c9 c  d4 c% g- x: J, V0 k
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);2 N; ~# l+ L$ x( J' z/ Z4 A% m
    glutSolidSphere(1.0, 40, 50);
+ e: F# z2 h4 O+ X! |) ~- ~7 I, U    glFlush();8 P' f) L  X5 b
}
7 X* I1 g, [( |0 S# @7 t# y8 r! c2 z& F2 k" ^: _  T  s
) m& N7 m' l: J/ }: S
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
- S2 K, J9 B* a( `+ h0 E& n: nvoid reshape(int w, int h)+ [$ t5 F  X1 ^8 {! x
{   / r. O- b, E/ o, M- L
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
7 \" U6 Z. ]' |1 {6 ~! B  \8 b; M    glMatrixMode(GL_PROJECTION);  h, u9 `- j# R9 H
    glLoadIdentity();
6 L4 G! s4 o$ V, v7 k+ y' r    if (w <= h)
* ]3 ^+ P0 V) ]: e2 W        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
- z5 W; y3 r* X# @3 g7 r7 [    else' W# {8 v6 n" P5 e' w; f, o- W% j
        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
4 S5 v: D  A* S( K) x, X( O# E/ v8 @    glMatrixMode(GL_MODELVIEW);
) T' q. V7 |4 i! c    glLoadIdentity();
# C$ s$ u, V; K. B8 _$ ]}
: }% }+ {. Y" [$ r9 |" R( v
% ]! f: F* D3 j  o* Z/* 定义对键盘的响应函数 */# K9 I2 P  o% ~% f6 Y6 |
void keyboard(unsigned char key, int x, int y)2 p1 S; ]9 f  v2 I( n
{' a  w: N8 Q: w2 v9 o+ ]' X
    /*按Esc键退出*/
9 {7 X3 L' X6 v* B% i0 t0 s    switch(key)
9 n4 F% \# I0 O( D    {6 l; G- f$ \1 D/ h% {( f
        case 27:
6 X  u3 {6 m  d( ^2 A            exit(0);5 [8 o$ N  o) l" D. v
        break;
6 V& ~0 R0 k/ P% q* N' m9 `    }  f: Y$ C# ~" |
}/ l: M' q0 m! j5 I

* ~- j4 Q! ~3 t6 ?4 I0 Z& ]/ W' W) g" l! h* L2 l& k/ r
int main(int argc, char** argv)  w+ J" t, l2 M8 m/ n# }
{6 D9 X% X: m1 c
    /* GLUT环境初始化*/7 E# H; L4 G% x' {! |3 ~/ v  W- P; `
    glutInit(&argc, argv);6 t8 c2 c: U* V4 Y/ D
    /* 显示模式初始化 */- L( |1 `/ k0 l3 `7 s% o7 `- @; A4 P
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  F( D% `4 K% H$ G" V. [8 [7 R    /* 定义窗口大小 */
! q$ \% p  g* {& d, T' V! E    glutInitWindowSize(300, 300);
4 b- ]9 |3 W% `. r" W  I" v- N    /* 定义窗口位置 */
1 L1 N" \7 j8 a; y* {# M    glutInitWindowPosition(100, 100);4 K. k, z; M9 X  S
    /* 显示窗口,窗口标题为执行函数名 */
1 {+ E2 ?& a1 S& d! z    glutCreateWindow(argv[0]);
% H3 `+ d  _& x6 c    /* 调用OpenGL初始化函数 */
4 t6 W; g( p  P- D2 A6 ]    init();& q% }- H0 _' \* Q1 K
    /* 注册OpenGL绘图函数 */
) V$ A( `# R1 O7 k6 c) m8 `    glutDisplayFunc(display);
- c4 Z% a& R& X: W7 B# W    /* 注册窗口大小改变时的响应函数 */1 u1 X6 L* H) F: u
    glutReshapeFunc(reshape);3 b0 C6 U# \, C- m2 z  \
    /* 注册键盘响应函数 */) B5 V' B- S% U! H9 ?
    glutKeyboardFunc(keyboard);& M) a; f* ?8 Y4 o3 Y
    /* 进入GLUT消息循环,开始执行程序 */
/ Y- k" E* q: I1 G+ ?9 ?+ O" f    glutMainLoop();
4 g/ g; [" H$ s4 r- `. Q/ `7 W" O1 `    return 0;6 s, o- @; k3 Q! {* b7 U" o) L, Y3 r! ?
}1 m+ S- h' h! S& [  O: p& a! I& Q

, u. K4 l$ I) x4 }$ j! M% G9 m5 a                                                                                                                                     88,0-1       底端9 y- M, d! f- T4 D+ u; K, c
1 V6 c- O2 h: A! v' y+ q" p0 h0 S- W
编译
0 R; T- S, W3 O7 t, x/ b# Q) jg++ sphere.c -o sphere -lglut -lGL/ l8 ~, [2 M) T- Z) z. o# i5 j

5 z6 T8 S8 ]4 R$ ?
" s' ?3 x, H0 u. J+ U  {. z. W2 h2 Z' m
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示
6 p# _  z+ x. h$ I0 m7 u
9 P. T7 Y/ p& g4 q% H1 I4 J 2017-01-24 21-51-09屏幕截图.gif
) }( \& b, s4 j4 b
回复

使用道具 举报

 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11) / ?4 V2 c2 Y+ c6 s
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-27 09:29 , Processed in 0.032748 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表