一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑 ( ^2 D; B, C5 H
5 I, _. O6 e& V) U  s

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

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

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


/ }& G) B7 ?0 c0 T' {% _

sudo apt-get install freeglut3 freeglut3-dev
4 y3 u" A. r6 e* Isudo apt-get install mesa-common-dev mesa-utils

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

#include <GL/glut.h>& F: J. f& P( B, a) D9 |9 U4 W
void display(){   
, o9 M& m! W' P& Q) qglClear(GL_COLOR_BUFFER_BIT);   
* d5 h9 e  S6 I" [* B! }# G9 G# KglBegin(GL_POLYGON);     
  X) _3 q5 p# v4 O& EglVertex2f(-0.5,-0.5);     6 n; P1 N. S+ P! E
glVertex2f(-0.5,0.5);     $ N. J5 I* T/ O. p; d
glVertex2f(0.5,0.5);     
; S& b8 [. f3 U$ x7 H! z/ l! e2 LglVertex2f(0.5,-0.5);      j" Q5 O7 ]& `2 m
glEnd();   
$ H9 @8 e% u7 N! CglFlush();1 {. b' X! k% n! G% B8 r
}
. T' ~3 p1 ~. K. z3 D
0 \; n. Y+ M& J9 S% Rint main(int argc,char **argv){   - j/ [2 w5 o6 r5 n
glutInit(&argc,argv);   
2 n5 \1 w( ~/ B# y# I0 d glutCreateWindow("Hello,world!");   # }0 U' h" f2 p/ G
glutDisplayFunc(display);   
, r* u  d5 ^( ^7 m+ ] 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!


5 P. j: ?8 c) n2 B0 B1 k+ X  m; f$ {! Y
, L; N* t9 G4 Y3 ~9 c5 `

5 s4 D( D) \5 ~. m6 B4 }# t
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果
7 N8 I1 T3 z! `* s8 q" v9 X7 a+ s; V8 a
2017-01-24 17-27-28屏幕截图.gif * p  ~1 m5 w% k' b. h" F' ]
 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c- M$ z5 R; X7 n# [$ k+ y
  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
( l. Z+ T" D' ~4 `7 v4 X1 R*/
$ `$ J/ g. W- G7 |$ T; `/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/; S. \3 l& s" b8 L
#include<GL/glut.h>8 ]( |0 W9 l; b9 u5 }- ~5 I$ f1 ?4 L. w
#include<stdlib.h>
4 o' {# ~% [7 U7 W) ^$ o6 f* V, c2 C( m% ~
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */* s( n0 Q! }/ x1 D+ m1 \8 r
void init(void)7 A5 d' h' ^4 u
{
# o0 p  ^8 s- W+ w+ C+ r  A  v5 L3 l    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
/ B" N2 p* g( f$ F4 `5 J, h    GLfloat mat_shininess[] = {50.0};
- v0 Q$ x$ f% y9 d' U' K    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};3 |# a1 b$ j* ?$ [6 M% a

( c  n  R1 m9 `- T: X) F1 |- j    glClearColor(0.0, 0.0, 0.0, 0.0);8 Y- \( F3 f; y6 b, r
    glShadeModel(GL_SMOOTH);
! d3 C5 W6 k+ I' b, ^
( z+ U3 L) d' H, ?8 f# k/ S    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
7 W( p* E3 \0 \0 i, U  A( R    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);& i) n, w& r. s0 F
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
! i* a1 ~% }( ^8 b( d) w+ O9 U# i# d2 |6 J
    glEnable(GL_LIGHTING);
8 V; \: W2 M- o    glEnable(GL_LIGHT0);
7 s( l9 g$ h9 O; N; Z1 }; g4 t    glEnable(GL_DEPTH_TEST);  t( l4 s' _- }  ?' a' _
}
; l/ U3 g' ~4 W+ j8 v$ c7 R8 m9 W! X8 {' L) T+ o, ?
/*调用GLUT函数,绘制一个球*/4 i8 f. g+ f5 ]
void display ( void )6 P7 }+ G& g2 w/ A, N* ^: Y
{' x7 `, n: }- ^# i* n  h
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);& ?( ?/ _3 Y; `4 `/ a9 ^: Y
    glutSolidSphere(1.0, 40, 50);
! Z; T2 r  N: j1 t6 D2 U) z    glFlush();9 l, x8 z8 ], B$ K7 V3 ~4 p
}
- Y; m1 x/ L' g  H. G; n
. h# c# W# W6 H5 c: j) {0 G
, q8 a4 B( E" h1 {1 `7 `9 R: m/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/5 o( |4 }4 j, A$ [
void reshape(int w, int h)  _) j+ q* J! W3 L5 a: ]; ^8 n
{   
; U6 ^; }  z* }* @    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
/ v! f( r% u* p0 b2 o1 H- v) J    glMatrixMode(GL_PROJECTION);
) l3 O6 p* X7 b3 @8 B# l    glLoadIdentity();
. g' [0 c& i3 L1 a5 v( B% U    if (w <= h)
$ v- N+ ]3 C/ n8 V4 E) \* N        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
$ c# e" o: ]4 m/ Y+ c    else
7 ]  w3 k' \, L4 a, n% u$ I        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
' e. X8 ^* B, Y/ w    glMatrixMode(GL_MODELVIEW);
; k! x# M1 A% }, q+ W7 {/ K( y  d    glLoadIdentity();3 ^0 B2 T* ^) Q8 x, [0 V
}
" f1 t5 G# }- c3 o  _- H
! W" _7 C- k, P% @* k/* 定义对键盘的响应函数 */2 z" g3 P/ ]5 p2 \  W- o3 O8 N1 f
void keyboard(unsigned char key, int x, int y)6 c: p1 u2 ^6 J6 r1 y$ l
{8 r! s7 i* Y% q/ A. {$ r6 N5 W
    /*按Esc键退出*/, {% @/ ]+ z. |+ S8 w& Y7 c" E
    switch(key)
  H1 R: g3 J/ u5 \, r  a, T    {8 _# V5 V% I1 @3 F; w+ S
        case 27:
% v3 ?3 Z4 e" l# c/ R! N            exit(0);
2 T0 F% p' F5 n" o0 p# c8 o        break;9 e' d8 E# K/ {/ _, F
    }& u% P4 }& ^1 X
}( b% _) H: `) ]0 I3 p
+ b( Q; E# y' ?& E

( Y! }  I" A1 y0 r. N- ?; g% Z: Nint main(int argc, char** argv)4 m7 u5 \/ }( \" x" @
{! G. J/ ], g/ Y+ r: \# C/ x6 r7 X
    /* GLUT环境初始化*/
' N6 {5 i! C' c' h    glutInit(&argc, argv);
7 v- C. [8 x0 L  P5 K* K/ J' A# w    /* 显示模式初始化 */
/ _, Q9 J: K0 J, [1 N* B! W    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
" k7 u+ H% S" H5 D0 S0 }    /* 定义窗口大小 */; `/ R5 n3 d$ _# P0 z
    glutInitWindowSize(300, 300);
, x) O/ I- S1 L+ h8 k2 ?5 s    /* 定义窗口位置 */9 N) e: v" n/ g0 h9 ?9 D
    glutInitWindowPosition(100, 100);6 Q- i1 z* W; n& ?$ i
    /* 显示窗口,窗口标题为执行函数名 */
0 G% E8 ]" Z6 E- X# K, \% f    glutCreateWindow(argv[0]);' a  B7 l+ \: P: ]( C
    /* 调用OpenGL初始化函数 */7 \0 i; n$ t# A: m7 u* w
    init();
5 U! T2 y6 ^5 R5 V: x  J+ A. m    /* 注册OpenGL绘图函数 *// t8 _7 d9 Z3 A4 Q3 N' d
    glutDisplayFunc(display);
* H; j" }3 N& Z, g    /* 注册窗口大小改变时的响应函数 */* \% I, G, D/ B4 S1 w+ R
    glutReshapeFunc(reshape);: c5 \- g4 |" @0 S
    /* 注册键盘响应函数 */0 M5 U; f# t2 {* K
    glutKeyboardFunc(keyboard);- t& L$ {6 i& {( M' Z
    /* 进入GLUT消息循环,开始执行程序 */
% c- E) A4 i$ \' c& B3 u    glutMainLoop();& X- Z4 s- n+ h$ Q8 M/ q
    return 0;
: ^4 C* ]! m5 R" T}/ w1 ^6 E2 V: ~/ x& s- n
! }' `0 a4 ~1 x+ Z6 F  @2 U
                                                                                                                                     88,0-1       底端
: r; T1 I% a5 p1 s! ]9 B% \6 i  h4 z' N4 g
编译+ R8 e5 G+ q! ^) n7 r
g++ sphere.c -o sphere -lglut -lGL
) ?* ~* o& X* z: z3 J% r. [7 X- H0 c  `3 U. o- c
& ?, f  F) k1 d. @2 i3 K$ |/ S
$ ]) P1 z. K! V/ N1 ]
 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示; b  g, p5 w% U+ f' _% z# k/ s
( L/ g5 H' u/ O$ s* t3 F
2017-01-24 21-51-09屏幕截图.gif
. X0 Q% B: e; |" b0 A
 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11) 2 A* z* m+ Z8 V) T/ I' A9 ?

本版积分规则

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

GMT+8, 2025-4-28 04:07 , Processed in 0.052660 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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