一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 5344|回复: 4

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑
7 R: S4 q& }& l' b8 g
+ A7 O: T  q9 c4 o; k1 T

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

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

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

; Q8 x4 `1 |$ V( R/ m

sudo apt-get install freeglut3 freeglut3-dev% S$ z0 G8 c0 [6 |; h& I
sudo apt-get install mesa-common-dev mesa-utils

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

#include <GL/glut.h>; j' ?1 T5 t! f4 \0 [- M
void display(){   
* L; }, @9 e5 }" g9 w& A/ U2 XglClear(GL_COLOR_BUFFER_BIT);   
6 v/ s) G) n0 q7 {+ W+ XglBegin(GL_POLYGON);     
2 ]4 X. x+ R5 R! @' x4 @glVertex2f(-0.5,-0.5);     
5 k+ C; o6 b+ H6 R; u6 f' HglVertex2f(-0.5,0.5);     / x& F$ G& h1 x
glVertex2f(0.5,0.5);     8 T: W" ~, S3 R) w3 R& Z. {. m5 P
glVertex2f(0.5,-0.5);    ' s& j4 v8 R9 ]! {/ H
glEnd();   
5 d: @7 R( N9 D6 nglFlush();
; n  s7 Y, q: v6 w+ }}+ y4 a8 ?$ h' k* s

2 Q$ [# ]8 v4 ]! c7 ~& Nint main(int argc,char **argv){   8 F7 g% j5 t" H. [6 L
glutInit(&argc,argv);   
: T4 p  H' I0 p" V' A0 n glutCreateWindow("Hello,world!");   7 |* A$ e& L% J" N6 u+ b& s
glutDisplayFunc(display);   % T6 n! h- ~  C6 {/ g
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!

; B0 \: D! x4 L: }
. {' F) A1 T7 m, T* Y1 @

" p% V5 f1 X5 i. e6 y1 Z; y1 C
+ t# D) T* p7 F' n3 F
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果$ e- y1 n# p! \7 h, r2 h* p1 e( h

" Z. Q9 r- c# x$ }7 L1 `! o 2017-01-24 17-27-28屏幕截图.gif
' [: X- ]+ F$ s: `1 p( x2 G
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c5 K* i/ X  n+ Q2 `7 C
  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。4 O4 R* U* b! W0 ?' \/ _$ A
*/
7 j7 r% M3 n7 I& p7 _. p" s8 ]/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/% w9 t1 j+ X% P1 e8 i! a
#include<GL/glut.h>0 C6 e' R. F) z. y5 B
#include<stdlib.h># l: X5 f4 ^' x! q6 o
( v, ~6 s% S% T  e
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
+ {* I3 N: S  M! x$ fvoid init(void)
) c, X, {' J4 i  I( P: |" s{
% s$ a# G3 E/ l! i: e2 h, F; f    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};% e9 A9 k$ g% H! q8 i- D" ^
    GLfloat mat_shininess[] = {50.0};
# {' w2 l  F$ I- z1 n  o1 W    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};6 U9 o- l; t9 G& e$ }  ^
. }" v  P; m+ L/ p8 i) _7 J
    glClearColor(0.0, 0.0, 0.0, 0.0);5 K$ d+ \$ c" E' z# a! v
    glShadeModel(GL_SMOOTH);/ C$ Q2 p" J- t  z+ j2 w

, R/ h8 i! o3 {! ?7 T    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);2 M, @- M* j" ^% |0 \& _" a; ?
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);* U$ N! M& _1 K4 `/ S: G* i  W
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
* Z; S8 B/ P% @* p, K) h: m
6 A/ p2 _) Z7 d5 L5 Z: A    glEnable(GL_LIGHTING);/ _5 V! x3 n1 R; _6 p8 N
    glEnable(GL_LIGHT0);! z! q4 y% r( {: q
    glEnable(GL_DEPTH_TEST);/ A: \( W& d- U6 _1 @
}
8 n# f: l7 D# u2 ?/ S
( d+ P; M8 S2 d, G/*调用GLUT函数,绘制一个球*/
! \$ ?5 i1 [+ ~( b. w) A5 ^void display ( void )
' y. c1 G1 @( _8 x8 g{
4 N8 e2 G, v0 w+ U8 M    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ x4 s, w8 ~8 P0 E7 p& ~+ k
    glutSolidSphere(1.0, 40, 50);
3 ~3 F+ X' z- _9 b0 m) L    glFlush();1 B6 V* u' J9 ?/ ^: G) K# J$ v
}' g$ Z' h$ C5 d
: _5 R* H2 S8 V! u/ c3 o" Q

2 n, @  w6 I. w" D# X/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/9 f6 v4 H% c& S
void reshape(int w, int h)
1 G) F5 O  @& f' I& d& x% ?0 t5 C, Q{   
# P& L6 G* [6 d: \  G+ j3 X* J    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
$ }: y) C1 ^% N  d    glMatrixMode(GL_PROJECTION);, b# ]: c" v0 z
    glLoadIdentity();3 S5 }( W2 C( V$ u7 k
    if (w <= h)2 }( i# i& y2 O4 H
        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);9 k7 q5 ?+ x( C7 |9 P( ?/ X
    else
9 ]5 j& {% U( I( t# L3 x4 y        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);  R" H) Z5 J% x4 j% k5 _
    glMatrixMode(GL_MODELVIEW);
0 d: {; r; ?3 O# v, Q3 l0 F    glLoadIdentity();
) f5 L1 N4 E; O1 {. o: Z}3 h9 A; Y: d' [4 A* l; X$ ~
/ k3 a  e- F: A
/* 定义对键盘的响应函数 */
  g- n8 F! W2 C- d/ w8 Lvoid keyboard(unsigned char key, int x, int y)) F+ \! u+ a  ?" @, p! {$ n: z
{4 X* K( E- e* z( u/ v$ m
    /*按Esc键退出*/
5 K$ j6 Z' y0 V0 q: R3 B# R) A; V# q    switch(key)5 J: ]' n: |* G& Q; y3 ]% i
    {
. e+ h2 l8 m2 Z% M0 t# o7 J) T( l  }        case 27:/ d6 r  x7 O$ a0 e/ x
            exit(0);
: Q% ~7 a8 F1 P0 |) w, D        break;% j2 i3 T  K' o
    }
* B& r- r$ G, S3 _}. z+ p4 @0 X. P

- h" e+ W2 j% Y9 e, @  U! I9 W
+ U9 J5 w' `- }1 }$ e# fint main(int argc, char** argv)% K/ W# e/ Y9 Z) Q3 j
{
' Q$ E1 c$ {5 x* n( c    /* GLUT环境初始化*/
& r+ i0 V4 n9 E# w" Z    glutInit(&argc, argv);# L6 Q% ~/ k# U! M
    /* 显示模式初始化 */
. T9 h* U) }5 ~% |. w2 f3 C    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);8 c* F1 M; J/ u
    /* 定义窗口大小 */" K$ x- G! X/ }4 V3 @. Y- P
    glutInitWindowSize(300, 300);
. G8 j! y8 G5 b    /* 定义窗口位置 */
: {, X: i1 L- A. ]4 T5 o    glutInitWindowPosition(100, 100);  y* [; W- B& n- A* m# v
    /* 显示窗口,窗口标题为执行函数名 */' o) B" I, h% o0 p7 M/ A( ?
    glutCreateWindow(argv[0]);3 G* w- u! g# r3 K# m
    /* 调用OpenGL初始化函数 */
0 o( {) h& q. T8 h( n, n    init();! y! Z& \" d/ R; O. ]
    /* 注册OpenGL绘图函数 */- q: S# U: n, B1 i
    glutDisplayFunc(display);7 A  {7 O4 l" e
    /* 注册窗口大小改变时的响应函数 */6 p0 D$ K: O; @4 Y3 X5 U( k
    glutReshapeFunc(reshape);- X3 k+ `8 T/ w
    /* 注册键盘响应函数 */* h; t9 Y. F5 @) {- I+ p, C
    glutKeyboardFunc(keyboard);
. ?# v5 P/ g% m0 y) H. |    /* 进入GLUT消息循环,开始执行程序 */8 G. d# g8 j! P8 w
    glutMainLoop();  R4 s6 g" b# [4 [
    return 0;
/ J. r, t8 h5 W1 g, m( L2 b}
$ W0 A/ J- i3 G
( W+ R# @# q; x9 @6 l$ ^0 G9 u# A                                                                                                                                     88,0-1       底端! o/ A9 w/ }' L+ H9 o) M9 I! j

/ I* ^' f% x3 L( C6 X编译
9 B- o# x) P, \+ g# A$ M6 g: Fg++ sphere.c -o sphere -lglut -lGL
  v0 |8 X7 D8 R( a* ?% Q
  R/ P2 }. |" C6 w1 \8 N5 t  X6 d9 T- d) G
* b6 E3 a4 W4 b" H" q3 _
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示
( ]* E/ o1 V, R% w) V: h, o
& h- d1 [! Q2 r& B1 F2 k 2017-01-24 21-51-09屏幕截图.gif
0 F! A7 ?# Y: {2 m
回复

使用道具 举报

 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11)
- b6 S! ^* T& X! r4 H+ `" G+ Q" _
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-1-12 00:51 , Processed in 0.041899 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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