一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 5107|回复: 4

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑
+ R) H7 ^  k' z+ I: I- V' z  d0 P1 [  d

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

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

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


7 W9 ]' F, l+ R7 _

sudo apt-get install freeglut3 freeglut3-dev
  [6 Y8 x6 R' g6 |sudo apt-get install mesa-common-dev mesa-utils

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

#include <GL/glut.h>
6 ^* y  {. j* ~1 Rvoid display(){    % K. I6 s5 p. _! d
glClear(GL_COLOR_BUFFER_BIT);   
8 B! B) D) P) t, @0 K0 v% q9 rglBegin(GL_POLYGON);     2 \$ ^' L0 A9 }* b1 O4 T6 h
glVertex2f(-0.5,-0.5);     
1 }/ U) w5 t4 D# |: QglVertex2f(-0.5,0.5);     
8 g& W6 z7 L8 b( q: [3 jglVertex2f(0.5,0.5);     
. `* V8 T2 K  l7 t& wglVertex2f(0.5,-0.5);    0 r! z  G2 Y1 f% Y$ l
glEnd();    + Z: Z/ b$ i8 \' \7 V: g: m
glFlush();# _% L) L: N, q7 ~9 d* Y
}
6 v8 x: V  k, s6 C2 G/ ?
, O9 Y' G/ A4 W6 Mint main(int argc,char **argv){   
4 x9 U) ^3 F; ]6 C glutInit(&argc,argv);   
+ I# @" k( w! N, p glutCreateWindow("Hello,world!");   
. M' U1 h3 s  `& `7 G4 P glutDisplayFunc(display);   ! _" m$ v% ?+ K4 u8 u" ~
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!

# }& _0 B3 e1 L& z6 d8 x5 X4 F" q

- Q" s) i# L0 J3 _
, l8 n/ H2 v! t* E1 G
5 M4 c+ N9 K+ ~3 e9 G/ T
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果4 O8 Q- \: l$ |5 N1 s# Q( P* M

* ~* f- m; e) @$ W$ w4 [ 2017-01-24 17-27-28屏幕截图.gif ) M/ Q: u' [/ p/ y+ R, t4 K
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c
. o3 F9 w* F+ W0 m1 X- D  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
/ G/ ]2 Q1 d9 a3 k3 @) G/ a*/
$ u1 |  B1 ?/ B* m! \* m/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/4 V0 D3 v& A$ f- o8 J
#include<GL/glut.h>
6 ^8 Q; {( d0 |' T1 B: b+ G3 a#include<stdlib.h>
  g* K$ L1 V1 q  p! _. a: z1 ?8 Z8 l- r
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */# S9 C; O! h/ C' d! p4 [6 ^
void init(void)
. O8 ?9 ]% S% w) t{
5 }* R3 H& D+ N, I    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
5 E$ o- A- z, W4 p$ U5 y2 B    GLfloat mat_shininess[] = {50.0};
2 m; s1 c  f: @2 R, d    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
$ y' c" I8 c! l( U8 q4 l/ d$ B: K, a; D9 M5 v
    glClearColor(0.0, 0.0, 0.0, 0.0);
  S$ {, O9 P; B; f0 u4 G# |1 w    glShadeModel(GL_SMOOTH);% `* Q$ W+ M4 S

* T5 X  f* Y- q% x' V7 H/ _    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
" o" h2 J6 Y. A) V( N    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
, @: d& z+ r8 l, h2 M+ F2 j    glLightfv(GL_LIGHT0, GL_POSITION, light_position);: f$ N. `# m" B4 s0 Z4 F9 ]; ?

, ?' {" p: }6 ?6 b/ J6 Q    glEnable(GL_LIGHTING);
7 O6 N' [+ k7 w- e& ]    glEnable(GL_LIGHT0);
6 G7 n/ \, E+ _0 Q    glEnable(GL_DEPTH_TEST);* u3 E: J7 q- }* P  {
}
) O7 T+ g( e- }9 u6 e- V( i. [" _- T6 f* ~; b
/*调用GLUT函数,绘制一个球*/! A0 t% d$ k8 f, f
void display ( void )
8 f8 V- z' d8 p, g+ e{  g2 S+ p1 d. r' H/ F
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);+ `0 V: u& N9 j2 W2 z: E- l7 g/ J4 z
    glutSolidSphere(1.0, 40, 50);$ q5 z- V2 m/ l/ K( t1 ^/ w
    glFlush();
! G$ |' f# j3 U( J# ]! m8 P( R}
# b( A2 ^% t& V4 u3 N+ y) D% n* Y% r. h% J; p
* V$ d, f+ a! E7 {3 u" E: v: o
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/3 A8 G" _* |2 b8 A# c
void reshape(int w, int h)
+ n9 ?. a$ z8 b/ ^# U8 H{   ' L$ v( `: Y" @9 H2 ~
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);. D, v3 ]1 s& i' g8 H0 ?6 `
    glMatrixMode(GL_PROJECTION);
, q  C, E# }9 z% J    glLoadIdentity();
6 h, X3 G1 Z5 F0 |) S1 ?7 J1 X1 ?    if (w <= h)
6 S- C3 \8 O  ^3 n4 @        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);4 x+ }0 f# z$ N9 L, `
    else5 |  S! B9 |0 s0 ^8 b( A
        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);# F3 H9 K7 M4 h1 Q
    glMatrixMode(GL_MODELVIEW);
7 V: ^0 |! c+ \% I    glLoadIdentity();
4 K0 s. @8 A; \/ @}
5 ~3 f) i- D1 b6 u; ]5 A
+ M7 G# i% Z5 u2 [0 I3 z% N' M/* 定义对键盘的响应函数 */
$ I% Q; U3 i7 _( Fvoid keyboard(unsigned char key, int x, int y)! O$ j7 g0 W# F, |. F: c: p
{+ h0 p4 l0 u: M2 V& Y( T
    /*按Esc键退出*/
0 j+ G1 o- ~! u    switch(key)$ [( P- q9 u5 X! w
    {
+ I9 r0 k* N' X6 t+ i        case 27:
  m8 Y* ^7 ]0 p; M            exit(0);
: X8 j4 f3 T& [! l$ j        break;1 F  O0 |3 A8 ~3 |4 G$ Q9 r
    }+ T' M/ o5 u4 E* b0 O6 d. `
}
2 S8 s4 {, [  `) ?/ N& \. f5 Q0 B1 o+ H- N
/ ^* j4 B, w8 n: U4 \
int main(int argc, char** argv), Z! V3 x, `# s& V8 e, v
{2 b/ }. Q# \, K; {+ R. K( b% L
    /* GLUT环境初始化*/( Q/ I5 B' d2 p+ m" z. o
    glutInit(&argc, argv);
" m! r2 w; @: V- i    /* 显示模式初始化 */0 R) y0 g8 s, [; u
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
- r; s( w. f4 n' p    /* 定义窗口大小 */
" f# k' P8 j, a/ t    glutInitWindowSize(300, 300);
1 N$ j: O* n( x! T    /* 定义窗口位置 */3 K% j- ^; e& C# s
    glutInitWindowPosition(100, 100);& v4 R  {/ D  j: }
    /* 显示窗口,窗口标题为执行函数名 */" i3 Q) F1 P8 `& l
    glutCreateWindow(argv[0]);1 S% C+ D8 H2 M: B' c
    /* 调用OpenGL初始化函数 */
; Z' d. S/ S4 ~' U8 g0 Z8 I    init();' d' X. o! Y8 [; Q4 K
    /* 注册OpenGL绘图函数 */
$ T- h& K8 d; ^, G! o  f% ~    glutDisplayFunc(display);
) N; Z0 Z# h$ r' B    /* 注册窗口大小改变时的响应函数 */. G: E  p  g2 H$ R- B4 p3 ]
    glutReshapeFunc(reshape);
( n: D% ?3 V0 L    /* 注册键盘响应函数 */
0 T- J7 ?: K- L6 j  E# b3 W5 O8 M    glutKeyboardFunc(keyboard);% h5 w( N" s8 t$ {9 C3 R
    /* 进入GLUT消息循环,开始执行程序 */; F" i3 h" j, L  O0 c% d9 i. e
    glutMainLoop();( G$ p# S8 u# w3 A+ k% H
    return 0;+ S& W5 {' b; E+ J
}
8 w# _, S  N9 u* m* u/ L  {3 l9 g5 l* b; Q& c% z
                                                                                                                                     88,0-1       底端
6 n: P( a  C9 A0 z2 I; d
4 K. m! h7 z7 C编译' s$ M+ H, ~4 ?/ A0 C7 R* p4 o5 v
g++ sphere.c -o sphere -lglut -lGL; O; K2 T2 B! t
4 l  e+ C( W8 m+ _, M; Y
6 v) l6 x9 D1 a7 g, D

- M3 C' q/ N* @4 X7 ^  {- l, P
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示' N" i4 b6 _" Q" e% J4 m

$ B) S8 A- z3 g! A# c: P& ^& h 2017-01-24 21-51-09屏幕截图.gif 8 b! c4 l# n, A7 p9 o6 x
回复

使用道具 举报

 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11) 3 x8 `2 X1 ^. s2 w1 s, [
回复

使用道具 举报

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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