一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 5763|回复: 4

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑 + W5 f8 ~$ ~& `3 b8 a; K- G8 B

0 N& D' O* c" \* r

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

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

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

0 d' G( V4 G) r+ Q6 a) S

sudo apt-get install freeglut3 freeglut3-dev
0 l, c0 z/ C, m$ E) f# rsudo apt-get install mesa-common-dev mesa-utils

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

#include <GL/glut.h>
' H% Q8 R9 Y' p$ a" }/ Q! X9 x( i8 Yvoid display(){    * j9 c4 h( K2 |
glClear(GL_COLOR_BUFFER_BIT);   
# |7 R- G2 ~3 HglBegin(GL_POLYGON);     
3 n0 R7 Q5 t! z$ N: jglVertex2f(-0.5,-0.5);     2 C! d$ g3 D, \. m) D5 J7 K
glVertex2f(-0.5,0.5);     ' D* E0 ~+ a- G2 H: |
glVertex2f(0.5,0.5);     
# C" I9 C+ f6 z8 I5 Z2 R" XglVertex2f(0.5,-0.5);    4 E2 d: F% G3 l2 h. S
glEnd();   
! C; v- p/ Q3 x4 H" WglFlush();0 B# F  a( C: @3 C- S! q' T+ ?
}3 E* p) j. F4 d$ R3 |: U
9 `3 O  m  C, m# J! P+ J* b/ J
int main(int argc,char **argv){   9 v9 }, U- c9 D; a( ~
glutInit(&argc,argv);   3 t+ n& \) H, Z! D% Y  z3 a
glutCreateWindow("Hello,world!");   ! f0 F2 ^3 [! E3 d9 A" Q
glutDisplayFunc(display);   + r7 o  }: V5 B' P
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!

: {" b& y0 F, U3 D6 o

- t. c! m3 O& Z3 ]3 T: L) i- p, p# r3 }1 s

6 b  a- _9 |6 }- @
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果
8 d$ j8 n3 x* Y
! _3 b9 S) m+ w% O# I/ p6 c 2017-01-24 17-27-28屏幕截图.gif 8 v& w2 n7 w6 v
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c! M- F8 u. m" C3 b; Y; G  q( t
  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。- u- w) L& X' P# s# F  R0 [
*/) h  k0 A) a( o  k( m6 n7 U, i2 s
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
# C5 r# {# U9 \) E/ \7 [#include<GL/glut.h>0 [  x+ b* z0 _2 [" D+ f
#include<stdlib.h>) S- G( v9 g3 j5 o
$ L! z  r1 g- t
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */7 d/ L8 q. F" ?8 A' O% p
void init(void)5 k0 D/ ?4 N& E
{% b& ]/ y) K2 u+ o8 S& J
    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};4 J; f+ K4 R$ u4 w' Q
    GLfloat mat_shininess[] = {50.0};
( }& C+ b( z. d5 P/ C3 S    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
2 G/ k  p* j7 K/ l+ q% G( s' R( {' C4 t8 X8 m. X
    glClearColor(0.0, 0.0, 0.0, 0.0);
, j/ O$ O# y& {7 j2 e# o- ~) D4 B    glShadeModel(GL_SMOOTH);# @* z2 e- z! p- h

. s% z* R4 p4 E$ Q" }    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
& `2 k9 ^9 }1 N' @    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);% ~: G7 K- e! P1 e. }! o: @" o: g
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);0 q! H4 J& `0 Q0 c
* M! N* P, Y( E' b' [/ E4 e
    glEnable(GL_LIGHTING);- @: y4 j. `& _$ i5 H" D# z1 z& _
    glEnable(GL_LIGHT0);
3 k+ `: P3 h8 f9 \* K2 `) {( [" q    glEnable(GL_DEPTH_TEST);% b8 k' H  ]& n' u3 j2 L9 H
}7 Y1 ^( L& ~) U# `: S, g

( z# L  C% A& C6 M+ ~/*调用GLUT函数,绘制一个球*/
, q7 d6 U# A2 ?7 m, W7 h, Avoid display ( void )
  j" @  b  }- G9 ~{
! n4 `0 @! V8 v    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
% B/ F7 l6 z5 P% C" r! u+ a    glutSolidSphere(1.0, 40, 50);
8 u) C) u# G2 x" J  j  m    glFlush();% o) ]" l  N& ?5 B+ m
}; G2 L' _' D5 z- F/ S- K( {

4 \" g! y. I0 k+ }
6 e6 G0 q% J8 J( ~% j7 T. S/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/# x0 h* z3 S' M+ D8 E7 I' O
void reshape(int w, int h)9 t% E- V) B) S% a2 }0 p$ B
{   
! V$ O" [1 t# Q' L1 p4 f    glViewport(0, 0, (GLsizei) w, (GLsizei) h);% u* ^1 V3 N0 B
    glMatrixMode(GL_PROJECTION);
) a8 R# a8 T$ M" k% Z! I* o1 P    glLoadIdentity();/ D6 G+ K! U  T. e9 d' Q
    if (w <= h)
; N% [( K; A% v' H) w        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
' x9 M0 g2 b! B1 r# D# I: @' S, e    else3 E0 K6 W# C% @" s7 K
        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
1 `) p# l% T! z* P    glMatrixMode(GL_MODELVIEW);5 v/ g+ V; S, S! o$ V# T
    glLoadIdentity();
; _& F0 }+ @7 v0 X9 H}
. v9 p' V8 B$ x7 o3 F" O! ~% e' E  Y3 l# Y# R
/* 定义对键盘的响应函数 */
8 S' `& ?9 o$ W7 A7 M: c7 wvoid keyboard(unsigned char key, int x, int y)  c+ p  ]4 M& }" ?6 t" z
{
4 z2 @, F, e, x, n! s  f5 D    /*按Esc键退出*/
$ y: m3 N) q8 `2 U# r" {    switch(key)
7 l8 b4 i2 D; i# f- }& S    {
' x% V6 z' J; K" i4 o        case 27:9 K; |3 z1 X: |: C& v4 K  w
            exit(0);# ^$ C3 [: t& [$ \" u- M
        break;0 {2 f# n. z: `( B
    }
1 @& a6 L9 ^3 ^5 |3 k}# V9 G$ @" X5 I1 b# `& y$ l# l

. `) s' s, p) D4 h/ M  t9 C5 p, j8 ~$ X) |5 _
int main(int argc, char** argv)
' w( P5 m5 e$ A8 }4 C9 I/ k& f" s{8 \5 w, _0 \& y
    /* GLUT环境初始化*/
+ F- [* A. a5 e! b4 o& b/ v: I" _    glutInit(&argc, argv);
% t1 V. B; a* I7 T    /* 显示模式初始化 */
% Q/ g+ G* E# G' [; j: q. b    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);" m1 t4 c0 t: s8 E
    /* 定义窗口大小 */6 H% k- T! M9 l/ t# \; F$ ?6 L* f
    glutInitWindowSize(300, 300);% b' i) D5 X2 V/ f" g% ^! |0 x
    /* 定义窗口位置 */
7 V6 t2 l, t1 D9 `# d5 x0 z& }9 V    glutInitWindowPosition(100, 100);  V) A! r& \2 I; [7 v+ i
    /* 显示窗口,窗口标题为执行函数名 */3 {4 w1 w4 L* E6 p6 D
    glutCreateWindow(argv[0]);
+ u: a5 l% s% e/ \9 S" U    /* 调用OpenGL初始化函数 */, F' E, o. P$ L' f- d2 L
    init();
4 I2 X3 [2 c2 H  c  T$ Z: X    /* 注册OpenGL绘图函数 */$ z9 a* {' c1 i! U/ {
    glutDisplayFunc(display);
5 U" L$ \* a- [% S    /* 注册窗口大小改变时的响应函数 */! E9 w4 T: z( P4 A: \0 Z: M# q
    glutReshapeFunc(reshape);0 W6 j- f! Z- _0 D  I" m4 F, S4 _
    /* 注册键盘响应函数 */: A! R1 n9 j( u; }
    glutKeyboardFunc(keyboard);4 _$ d# }; t$ ^; ^2 t/ ^
    /* 进入GLUT消息循环,开始执行程序 */9 ^/ B3 M  V! X& b: G7 s1 E
    glutMainLoop();4 p' u$ O; M9 h8 _8 |
    return 0;8 Y# |; N) c3 N$ z9 W+ a
}
% Z2 l  z; t7 r. @& z' }9 Q, J' }
' a% M% |- e+ A: S. W- A& ?" i                                                                                                                                     88,0-1       底端2 @( R0 r9 m) @/ t; V6 L: a
- M: B. z# A* J/ ?0 l3 t
编译
6 z2 G6 z- o. {  B* ^' w' L) h9 p' tg++ sphere.c -o sphere -lglut -lGL
1 V9 ?; J( y! M" z1 [6 f
& D  x9 L" I+ T. x
+ E" n8 s; z3 E2 \& w" j7 d0 m' X* c/ x; ~: ?7 I# u- D
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示9 I' m9 ~1 Q1 K8 h4 L" q

, Z3 |+ Z0 y% V0 z+ i& @- O 2017-01-24 21-51-09屏幕截图.gif % E7 i; x4 a1 y4 {) d
回复

使用道具 举报

 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11) 8 ^* p: B9 z+ c. {; W
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-7-13 06:38 , Processed in 0.034539 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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