一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑 9 O; L' D+ F# G4 `9 Y' V" u
5 [3 z1 D$ H" n

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

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

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

, m8 p, e5 b0 x$ N

sudo apt-get install freeglut3 freeglut3-dev
! r2 W; _2 b. ?2 v& T" ?9 Isudo apt-get install mesa-common-dev mesa-utils

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

#include <GL/glut.h>" l. ^& k, b/ A9 `: c) N( Y  r
void display(){    ( e1 s3 ^: ?4 x/ V/ u; o: i
glClear(GL_COLOR_BUFFER_BIT);   
+ p4 L# d$ T/ mglBegin(GL_POLYGON);     8 V" ?6 E( M" b( Q6 f! F  t
glVertex2f(-0.5,-0.5);     + v: ]1 p, P! q! c7 ~; Q
glVertex2f(-0.5,0.5);     
& [6 k/ L$ U( {  Z; \% {' GglVertex2f(0.5,0.5);     
) ]9 R; Q* F8 u7 J9 Y# B; E& eglVertex2f(0.5,-0.5);    / A* ~- X5 U& D7 x! `& L" q& l5 K
glEnd();   
$ x: c3 G. \# a. G' K2 ZglFlush();: ~( d- }" I5 w# S( q' n
}9 ^  Z- f6 b# r8 O& O1 }
( Q, h0 g9 p7 `9 m
int main(int argc,char **argv){   
0 W+ n, G3 H0 o0 _$ j' F8 G- ] glutInit(&argc,argv);   $ q3 n* [; j, s2 W+ A$ \4 u+ _
glutCreateWindow("Hello,world!");   9 v) j/ N4 j6 p5 l$ i: o) L
glutDisplayFunc(display);   
- ?8 G: t8 o/ \& U( Q) L 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!


; Y% A$ K8 u6 ]7 ?- b
8 b1 n& H5 i4 W2 Q& l( P$ r
7 R$ h2 x7 I# m0 g; f. ^9 e1 o& w! G0 }% p3 Q( n  L" h
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果
* J: @# x3 I  }" w' _' l0 d
' G4 ?; Y8 B- K3 X4 W 2017-01-24 17-27-28屏幕截图.gif
7 x- @$ c/ I4 j# y( n
 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c
. {. y' x. f! F* i* Q. e  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。4 u" T6 o3 @; s2 f
*/
# z' D6 q. I, c3 b$ Z4 p7 Q/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
6 H3 \- P4 s& H#include<GL/glut.h>
# k+ B7 o! T- F7 {8 d, H: N#include<stdlib.h>
4 _" `  H4 F$ i" N* b1 d( J2 h9 t" X; e$ g
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */* N1 P9 a( O0 {1 r. D
void init(void)
# P4 \# {* h/ F/ L1 D) E. }8 z{
& ~/ b4 m! z1 }( L6 I    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};: o; N$ @& t, `# Z* w4 B
    GLfloat mat_shininess[] = {50.0};
- P. j5 D- D! q: N5 e8 F    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
# m9 T. g: ?6 a* c+ Y# b
/ L4 p# S; F: z& _    glClearColor(0.0, 0.0, 0.0, 0.0);
! j) m) e1 n9 ~, H$ Z  F+ ]    glShadeModel(GL_SMOOTH);$ x. c: k! h& o0 `0 `3 m
8 e+ s8 f" k. Q- {$ m5 S& I
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);& j; b: i& z7 w2 S2 b: H
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
# E$ _1 A' ~6 j    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
5 D. a2 ~' R2 D5 h* x. i, e5 Z7 R
    glEnable(GL_LIGHTING);
* x( a! M8 S, h3 S( {$ X4 Q- O    glEnable(GL_LIGHT0);
5 Z9 s0 c: Q3 C- O$ c6 Y    glEnable(GL_DEPTH_TEST);
1 r) {; b. w" u* G  J" N* ]6 E}& D' n& i$ H/ ~6 Y  c# ]
' `* {1 i. T( B8 s
/*调用GLUT函数,绘制一个球*/4 l3 w9 f& T) A
void display ( void )
' y* ?8 n; o0 U: @& P{2 V* `6 ^" a5 i
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
0 V$ J$ H( w6 G$ G* Z% g  N/ E& ~+ }    glutSolidSphere(1.0, 40, 50);1 {' r2 B' u8 `& B3 g/ D
    glFlush();9 y% W; `1 g( l4 m9 m
}
# k: J6 o& b8 m+ R$ a9 W3 n# k! l* H
5 v# o( f1 ?0 E- m/ U; _% H* M
6 m& e5 D  k, m/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
& B3 f% F# N2 I* p- e/ \void reshape(int w, int h)6 @! o" P5 ?9 Y7 G& X
{   
/ i3 O! F- c+ O) D0 }    glViewport(0, 0, (GLsizei) w, (GLsizei) h);: E, ?" _3 a( P( h5 ]
    glMatrixMode(GL_PROJECTION);
+ M9 k8 A- H$ U2 x6 |3 n* p    glLoadIdentity();
. x* q( Y: H# {0 H8 c    if (w <= h)
5 S( T& U! b, P8 V        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
, j# A+ F, G3 {4 i5 {6 h, Y    else
  d7 @- n- Z( Z+ {        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);( q1 i2 e8 R- P. h- m1 l
    glMatrixMode(GL_MODELVIEW);+ w/ W; Y+ G+ X9 Y8 F6 P8 s- M
    glLoadIdentity();
5 K( b$ s5 @6 Q5 i; V! ~5 P8 s# _}
2 S9 P4 }" o. H5 K9 f# p" B% E1 k9 F1 m; E( n/ A9 Y
/* 定义对键盘的响应函数 */
4 I" C3 @# q. h$ J! E4 Cvoid keyboard(unsigned char key, int x, int y)& Q  J, V3 B& t. D7 c
{( B2 m( I; u% q. R
    /*按Esc键退出*/
& B# O$ M8 M: ]2 @) V/ z& c    switch(key)( e, M0 k8 [1 i! ]" e
    {
3 W; o7 D9 }! ~( A. g        case 27:
7 E: I% D) N5 R7 p            exit(0);
' l. ?  {& ?+ B1 x$ i, v+ S        break;
3 Y8 T! J/ H. v5 s( ^    }- S  z1 @3 J3 C: I) t
}
7 _# L! s! {, U) A8 ?3 z  P% I, D
# x2 n  G# K. T! l( Q0 S0 Z
int main(int argc, char** argv)2 ~: i2 d6 ]2 H8 }9 o! Z
{
# N8 I4 W6 v* i! m) K1 I    /* GLUT环境初始化*/
" N; Z3 W# x3 Y. Z5 K    glutInit(&argc, argv);4 ^3 o$ @8 r; \# s
    /* 显示模式初始化 */
, R( S9 a6 H% ]8 w& P, x1 R; A    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);' N" X) ]7 U8 ^& F
    /* 定义窗口大小 */0 B4 M. _! g3 Q
    glutInitWindowSize(300, 300);
+ q* X) M/ I* C% K, M4 z    /* 定义窗口位置 */
7 ^- F7 Y6 _4 o6 ?! h! b, O    glutInitWindowPosition(100, 100);
8 P# r/ T' [. }    /* 显示窗口,窗口标题为执行函数名 */
% c( c8 R0 y9 {7 F    glutCreateWindow(argv[0]);' e. j5 U. d( X1 y! C6 L
    /* 调用OpenGL初始化函数 */$ q# x$ {2 C1 W+ s  I. W
    init();
4 l" m* `0 F2 v: m" `6 }5 W- k$ U    /* 注册OpenGL绘图函数 */
" K; w$ S& F1 L  @" X& U6 p  c    glutDisplayFunc(display);' W+ h7 P0 Q; |9 ?
    /* 注册窗口大小改变时的响应函数 */) P; w! Z+ G* p# c
    glutReshapeFunc(reshape);% K( n1 `4 p* Y  h; ?
    /* 注册键盘响应函数 */1 d' l! F* s7 ]# |$ j, o' E: z
    glutKeyboardFunc(keyboard);
- U  c# @  E- f  R9 Z2 w    /* 进入GLUT消息循环,开始执行程序 */6 `" Q) m: x) w2 J
    glutMainLoop();( d  O1 y) [5 D
    return 0;. G7 `0 N0 D. j5 U  W
}  S7 ~( ?9 x. `/ {$ I2 F

& b1 c7 J  ?6 T$ v( A1 \                                                                                                                                     88,0-1       底端
% }! {8 }7 E& |1 v  b! Y
' u- R/ c3 U: f6 w8 D编译* P; x6 A+ ~8 j* r, p9 G
g++ sphere.c -o sphere -lglut -lGL8 k' P: a# N0 Z$ Z$ O6 m

/ O. d4 S' c8 V: p$ y3 q+ E
6 S- D( }8 u' C9 o; _" C5 l4 v( T6 e  k
 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示0 N. L5 \- C' d# X/ d
' v8 e% e5 n9 j( @5 K4 F
2017-01-24 21-51-09屏幕截图.gif
1 d7 U  a% {( h. D. s, E) l
 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11) 4 Q' {* Z% y; q

本版积分规则

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

GMT+8, 2024-4-16 19:06 , Processed in 0.044897 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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