一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4875|回复: 4

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑 ' x& i. {6 R) o# c$ ]  g' E6 K
3 I- }- x1 W. O! }

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

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

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

4 N5 g  o  c1 [* j: Y8 Z6 u

sudo apt-get install freeglut3 freeglut3-dev
) I0 T4 o" O+ K5 a' J$ P8 Ksudo apt-get install mesa-common-dev mesa-utils

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

#include <GL/glut.h>" z9 H+ Z2 |8 H0 s! y$ _
void display(){   
7 P' w, Y) g9 e' B1 J1 LglClear(GL_COLOR_BUFFER_BIT);    + q, U- z0 q" u3 l1 ]# Y# K* z
glBegin(GL_POLYGON);     
2 c0 G% J4 [. f% x1 ^& ]- ~glVertex2f(-0.5,-0.5);     
* D& f  k) s+ L" h( P( i* V; F6 e9 v; JglVertex2f(-0.5,0.5);     1 K/ i* H  r7 `0 `& T' c
glVertex2f(0.5,0.5);     8 d4 {7 U6 `1 B8 K& i! x. [
glVertex2f(0.5,-0.5);    7 T. g8 I; w* L, Y5 |# c
glEnd();   
7 T; }: m6 N! z% ]4 s6 c$ \glFlush();
; @( @* o4 R! N7 J/ T$ l6 C}
9 g& S5 w0 A: p
+ H+ C/ u4 }1 aint main(int argc,char **argv){   
) k4 f% g2 \9 D  |- A glutInit(&argc,argv);   
  m! A4 h. m( H* u4 [ glutCreateWindow("Hello,world!");   % d6 M6 K( Z7 H6 m" {
glutDisplayFunc(display);   # s- x  ?' ~8 y1 H# q2 B" r, ?% R
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!


: X! d# k. j! H) w# ^+ q3 {% C( m/ t& }3 [: u
9 V" t$ }  x2 \  Q0 I8 W  t
: C9 \: c1 J) R/ G% @4 f4 \8 B) D
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果
* L5 O6 g- R& V5 C" C
9 G5 z5 O2 m! i3 i 2017-01-24 17-27-28屏幕截图.gif
5 A8 W5 ]5 ], O- L6 g4 s
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c
" @/ ^& [# v! G0 l% U( n  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
. N1 A& B- V# y2 m6 C: g*/% P% M2 {, a7 A( e
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
- [9 }$ @" c3 u" E; z#include<GL/glut.h>
8 M% B. M8 d' e, X3 N' X5 h1 a#include<stdlib.h>
' V1 X7 ^- R$ j4 e
2 a; T( B1 i( ^* s: V+ Q/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
$ G) H9 p! Y3 s& ?" Y5 pvoid init(void)$ b5 R, W* J4 N) }2 f3 {' L
{
* J% T7 }/ E6 h5 @7 z$ o    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
) ]' N# K* Z) [4 N0 u+ Q    GLfloat mat_shininess[] = {50.0};8 c# d0 V4 f. \6 i2 B& |( [2 r( y- S
    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
" l. z; U/ [9 Y5 q( v/ k% U8 @6 i4 y, H6 f1 C" y
    glClearColor(0.0, 0.0, 0.0, 0.0);0 g$ {+ y/ D4 E' H
    glShadeModel(GL_SMOOTH);
4 k+ w6 c: u; R) S  u$ G* \. N2 c) \1 R' i2 t' z7 L$ V
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);7 B% W! Z' j# {9 e1 ]; x/ k
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);0 K4 V% `% t3 h& M% J% i
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);  E0 M1 P1 J4 v5 e6 V
+ |* D5 s, H& N. }! P1 R; W' O0 I- B9 w
    glEnable(GL_LIGHTING);8 q8 k/ l# c% o0 t0 J
    glEnable(GL_LIGHT0);; ], e$ |8 h% Y
    glEnable(GL_DEPTH_TEST);( F! _( l, J' {5 p. v2 w" G. y' I
}
. y6 O* h, C( i- i, j8 |3 K  `8 x2 D
/*调用GLUT函数,绘制一个球*/) E8 V# a5 @0 V9 Y! L' x
void display ( void )
# W) G7 a; d! i2 g5 i% \{* n9 H6 |2 K& b  l6 v7 t. F9 u* P- l* f* W
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- I6 x8 E" g# L. ~+ _4 y    glutSolidSphere(1.0, 40, 50);
; n) \) A% Y& c+ v& Q2 C    glFlush();3 O' }, H9 ~+ B! b) T/ a
}5 e, v( a* [- K0 _

  e5 q1 N3 ?  B, j3 `0 f3 T1 _  v; T' D6 I) b. ^
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
+ ^8 {4 z% D' F/ g3 b( cvoid reshape(int w, int h)
. Q0 t) z( V$ T{   
5 j5 [4 B, I/ J9 g* w    glViewport(0, 0, (GLsizei) w, (GLsizei) h);5 t8 t( C& l" {* ]
    glMatrixMode(GL_PROJECTION);' a. `' E: Z4 e, U0 \; f3 e
    glLoadIdentity();
' _2 V. r; P: A( [, S    if (w <= h)
3 M4 K2 v# n/ {$ ?9 s3 ~  ~7 D        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
. P7 x7 s# B9 ?, m! `1 ]    else
: I8 }5 ]$ J3 R  x/ f& p1 L  X5 E        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);, ]: \; D5 C+ m% d) i8 S1 e
    glMatrixMode(GL_MODELVIEW);
# ?0 |6 M! l; Q# }6 r9 O6 k    glLoadIdentity();
% O% ?, }1 M7 h! }0 B}
$ v6 H! H6 n) T* X5 A  U
- U, d- w; Y2 Y1 N/* 定义对键盘的响应函数 */; o4 W9 `7 @8 q1 P# O; \
void keyboard(unsigned char key, int x, int y). [2 J9 s8 B. n) ^1 ]
{9 j; {' N: t3 F7 }) Y: c
    /*按Esc键退出*/  b) G: B8 R  ~% v: Q+ \7 U
    switch(key)
% k8 w7 d5 ^3 m% j* ]    {
8 h! E% P1 X& V        case 27:. R1 A- U5 z/ r' r
            exit(0);+ z4 o  p& q8 C  o9 g* |
        break;# n- W2 E. [% u( M1 Y
    }# {  ]; n$ M& i3 S' `
}; z! T8 ?0 q2 j& E2 q! {' E

! k* v5 v5 n, Z5 C- P/ ?. F" t1 p8 @. I
int main(int argc, char** argv)6 O' m3 f& Q/ n/ i  a
{5 T% n. e* m+ k( u: n. k
    /* GLUT环境初始化*/4 B& |$ L2 U7 ]9 x6 X" F$ Z
    glutInit(&argc, argv);% f; |% V9 S6 F: J0 ?, E2 P% E
    /* 显示模式初始化 */
# t  Y/ G  t4 l- ^" L$ H    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);. V& ^0 T% }/ @" M  y- X
    /* 定义窗口大小 */
) K  v9 v/ d" g( _, `    glutInitWindowSize(300, 300);
! u. ?# Z, N) R- Q  m' u: e    /* 定义窗口位置 */
) i/ I  z# Q4 d% ^! G    glutInitWindowPosition(100, 100);$ L. H/ f! Y- o* B7 B
    /* 显示窗口,窗口标题为执行函数名 */, C+ o7 p- t. d; o7 s5 P
    glutCreateWindow(argv[0]);$ [3 i  o6 t4 O) z5 |8 ~5 W7 Q- K
    /* 调用OpenGL初始化函数 */
  F- K% r% E6 P  {) ~' i/ u7 {    init();: c) W7 w. L( h, v6 J
    /* 注册OpenGL绘图函数 */, w# q8 ]: f" D0 h' C# F
    glutDisplayFunc(display);8 @" ^" D* g. Y: g
    /* 注册窗口大小改变时的响应函数 */
/ I* q! }! {. {( ?+ ~+ S    glutReshapeFunc(reshape);+ j& }. H4 w+ N+ `' U% m0 P
    /* 注册键盘响应函数 */" L6 {) z4 D, t7 f; ]+ S
    glutKeyboardFunc(keyboard);4 g0 u) V4 e$ W7 N, m
    /* 进入GLUT消息循环,开始执行程序 */
3 }# I9 \, `; [1 e    glutMainLoop();% ]% x$ c# g' E% L; Q" N( M8 U$ E9 m# o
    return 0;( u1 o$ p* w" ?. b
}6 ]# z- |5 P# B) m6 }
8 J; j4 W  q0 n' a
                                                                                                                                     88,0-1       底端6 b. s6 U$ i8 c0 `

3 m% A% v. o7 n% m编译
5 c4 X% N6 ~' K% y, i# Gg++ sphere.c -o sphere -lglut -lGL; E5 a& a$ v* z, ~. p% @

) |; E; m9 U* T* c( g3 O
% B. e$ X1 k+ L
+ `" c- f. c) n2 h6 Q" r7 \- X
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示8 p" U6 q: b) i+ D
* g7 g6 \# @5 V1 W5 u7 m
2017-01-24 21-51-09屏幕截图.gif
6 v% K& o- I/ y& h7 o
回复

使用道具 举报

 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11) # l. G* o  w( x
回复

使用道具 举报

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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