一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 3458|回复: 4
收起左侧

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑 & |* |) s8 Z5 Y* |
) M3 D" f" w9 `+ ]$ x: V. v

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

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

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


- f3 F6 h& w5 O# g6 F! O

sudo apt-get install freeglut3 freeglut3-dev
& z2 j, P5 n" K( S8 r2 q$ Gsudo apt-get install mesa-common-dev mesa-utils

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

#include <GL/glut.h>3 x3 L( i( L9 N& J# D# t' F8 ?6 L
void display(){   
# d0 U# f% z  I; ~$ E- _, vglClear(GL_COLOR_BUFFER_BIT);    : j' q4 Q- |; r  o, ]
glBegin(GL_POLYGON);     0 A, p8 [& T2 U! V) @* D
glVertex2f(-0.5,-0.5);     
0 x9 |2 L, q# K5 W5 `0 IglVertex2f(-0.5,0.5);     $ K0 L6 H' }  N% l
glVertex2f(0.5,0.5);     - r. Z# j* L# K
glVertex2f(0.5,-0.5);   
" ]/ d4 v2 i/ tglEnd();    * T+ B  G# X4 B- d# Q
glFlush();
2 |+ R) \) |! k! e2 y" f* D}
& ~5 v0 M& l/ N0 Y/ c0 O) y3 v) W9 V) H
int main(int argc,char **argv){   9 a' J8 o1 h# \8 z9 p3 s
glutInit(&argc,argv);   + D* y  G; C$ x( z( @: W9 ]
glutCreateWindow("Hello,world!");   % n- A3 y. V# Q
glutDisplayFunc(display);   6 q: m' {$ h- b- n8 a" N1 d( 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!


; f8 u  K( A8 f/ t6 e3 v- U
( U2 ]1 ~: T5 P- \
5 N: [1 E) i& r6 H& E' D6 Y" G, L5 Y% E* {3 C% g4 `7 {7 Z
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果/ T9 F: {; U5 `$ i0 D; U1 Y
( h7 a  O+ j+ T1 ]# p! [" M
2017-01-24 17-27-28屏幕截图.gif
. j2 C) {* @( j: v: `
 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c: V' A8 C" L! C/ j
  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。" u/ O7 f+ D6 ]3 q( E  n, i
*/4 i+ G& q# B; Z0 t& n; ?: ]
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
; y  k% y1 t% B) ^#include<GL/glut.h>6 v2 S3 V/ B) L+ W: k
#include<stdlib.h>
2 l% \" x* p- e( F" T
7 n9 j" ]+ r6 \# i/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 *// U; o! J7 X: P  ?& X1 A
void init(void)
- p% ?& _9 R4 g1 H+ O, I6 }{% z7 G" W: I1 g2 s3 Z6 [
    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};( N# L# F5 J: [4 [( w3 I
    GLfloat mat_shininess[] = {50.0};
- F4 }, p2 U& b0 Q    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};* a* k2 n: z' j# G
, d+ C. f6 Y. Q( w$ x" w
    glClearColor(0.0, 0.0, 0.0, 0.0);  r- s; E9 _  j! Y, p3 |" T
    glShadeModel(GL_SMOOTH);
& K; a$ T" ^0 D+ Z# @( u/ B6 j" Q- h, u
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
: F; ?3 @& t; u, I    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);/ S8 f! r9 S3 ~; O: P' ~
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
6 U+ G! C2 D$ L: S; a' ]# N* V3 j6 l( U% p) b
    glEnable(GL_LIGHTING);
% e& O8 Q+ f1 g/ b" X    glEnable(GL_LIGHT0);( L) l) [; W* q7 b
    glEnable(GL_DEPTH_TEST);- M/ c6 Z, q$ t. e0 P8 t
}
- g9 e# ?! K  C' o( U5 A7 r
2 G) j. ]' ~8 G5 I/*调用GLUT函数,绘制一个球*/1 W' K9 R; t; w$ Y- Z
void display ( void )9 I- L" y( S3 Q
{
: z" ?0 J4 P  E$ L. k    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);. W' }( s: J+ u2 w
    glutSolidSphere(1.0, 40, 50);
) ?/ |" g. H0 b+ \; l* h    glFlush();1 `% j3 @+ \, ]. y9 d
}9 \2 e5 \3 _& [* [8 V* u( w

: i2 q4 K+ M5 A& L1 p1 U9 i4 T8 u1 ]+ n7 ]! x- S0 t4 ?
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
7 o; n2 E3 a% K5 _void reshape(int w, int h)
- ?, S, P* k3 W9 m{   . J8 y; f# p1 F: Q6 B8 `2 y, r
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);/ ~" ?( ]' F4 S# M/ t& @4 l! |
    glMatrixMode(GL_PROJECTION);
3 t/ i  _) H- {1 ]* E' S' h7 _5 w. p$ b    glLoadIdentity();, _/ c$ t' W0 O& t" W2 s8 f
    if (w <= h)3 j  M4 ~+ C/ t
        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);6 S; z9 R3 Y" t& u8 d: x% K
    else
2 \. F* b& A2 P" u        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);1 T4 a: P( r! k' @
    glMatrixMode(GL_MODELVIEW);4 k$ `" F) u- B5 K
    glLoadIdentity();5 A! E+ U* x$ K6 T3 f
}! M( P5 F. E8 @8 M6 b
# W6 w/ _5 I5 P2 Z2 M& x( K2 U/ I" c
/* 定义对键盘的响应函数 */
: C' |. J3 o. k$ p) Vvoid keyboard(unsigned char key, int x, int y)5 b' p6 }0 h& U% r( e& f4 G
{
) ]$ M5 S6 y' O/ ^' c8 ^" z! S- U    /*按Esc键退出*/
3 j+ Z4 V% O7 F8 k3 v8 V! h    switch(key)+ G0 ^- q" H$ w/ v# ~
    {: d) `" j% H' L  Q+ X& ~' q
        case 27:$ ~1 x( i- p1 c7 d) b* M3 J
            exit(0);
+ @6 h! j9 q3 m- d        break;/ x( J! s% y: J  v
    }' s7 l$ n6 W$ \; B5 V
}2 W4 [/ l( Y* E1 Z6 {' C

5 d- ~# @4 w$ O% P6 K- h) W) S) k
7 F  K' Z5 `# B- L! _int main(int argc, char** argv)
, j: e$ l2 \. D{  _$ w# u( N7 {# n9 l
    /* GLUT环境初始化*/  ^/ y1 _" b9 \" r, s
    glutInit(&argc, argv);! R/ S( f/ z* S9 r% l$ Y
    /* 显示模式初始化 */
! }! w6 U$ k" M    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
9 ?1 Q: R( M( w0 Z4 m    /* 定义窗口大小 */
# i' v# n7 q/ Y  _- d% j" g' c) W    glutInitWindowSize(300, 300);$ I: s! H; \; ~8 l; X
    /* 定义窗口位置 */
& _* U! U9 U# |2 @0 f) g9 l    glutInitWindowPosition(100, 100);- L/ V' Y' O; J. i0 [3 r& {
    /* 显示窗口,窗口标题为执行函数名 */0 ?. [1 _2 z1 Q! V+ p* T. }: e
    glutCreateWindow(argv[0]);) j& M0 A. I9 U. y2 m4 g0 M  p7 ]0 e
    /* 调用OpenGL初始化函数 */- A6 o1 i5 b( \
    init();' R: S7 u& C7 n% j/ I
    /* 注册OpenGL绘图函数 */" e/ x! s9 @0 n  P/ m
    glutDisplayFunc(display);
. q6 ?4 {8 ~& H- j: P    /* 注册窗口大小改变时的响应函数 */
. W: O, C9 `" ]$ F) r: ]    glutReshapeFunc(reshape);
  [' d8 y+ l" F4 e  J    /* 注册键盘响应函数 */
7 h" X) I/ d/ D$ g0 ]3 P4 X9 I" \    glutKeyboardFunc(keyboard);
! ^9 A( |: H; d, j- o8 j    /* 进入GLUT消息循环,开始执行程序 */
1 p2 d1 F: r4 e# |$ V) o6 |( A2 |    glutMainLoop();
6 u6 V5 Y0 D; ?" Q& c* B3 F5 i    return 0;
  ^: R# H* K/ |4 \7 N3 R}
% }4 R# w& K1 d! ^7 F5 F5 V% o
+ U7 I# X3 F. W- @" S                                                                                                                                     88,0-1       底端) [2 E) j( n3 q! [4 s/ w) o

8 z0 b5 Q. y! Z: S编译
0 a1 B4 P/ m4 V! u* p  Mg++ sphere.c -o sphere -lglut -lGL7 g, _' x# H  L* t+ R2 ]3 \
6 [; E: l- [! z6 F& G( c) K/ x" ]" s
1 f, b$ U* [4 u3 F
$ k' j9 o- B/ e2 s# l2 J6 v3 u# i9 Z
 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示. x8 G  A6 H% F( H0 F! j2 S

6 E% `- W4 o) [$ H$ ~ 2017-01-24 21-51-09屏幕截图.gif # {1 {' F# B! \2 _. O
 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11)
& d3 J$ Y, \8 O

本版积分规则

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

GMT+8, 2024-5-2 10:33 , Processed in 0.045920 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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