一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 5581|回复: 4

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑 - M; A! F6 k) Z3 w' X( H' g

# j+ i/ t2 y& |9 S8 ?7 `

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

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

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

! u% g1 z4 ]/ D4 C9 |! v+ Q

sudo apt-get install freeglut3 freeglut3-dev4 r2 v9 K  n  r8 |0 H& K
sudo apt-get install mesa-common-dev mesa-utils

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

#include <GL/glut.h>
% _( ~1 o# i0 R# ~void display(){   
. F* W  h* t; k4 y' lglClear(GL_COLOR_BUFFER_BIT);   
: h: w; b2 T' E7 ]' ~glBegin(GL_POLYGON);     9 X* u0 E# \5 R; }+ \; E+ q! x
glVertex2f(-0.5,-0.5);     ; |, a4 [" _% r( m+ u; `
glVertex2f(-0.5,0.5);     9 O! l" T7 z2 D4 u; C6 l9 Y
glVertex2f(0.5,0.5);     / h' a2 S) y" u- ]
glVertex2f(0.5,-0.5);   
  W* d. Y) F! [* N& oglEnd();    : {6 ]1 \4 K, i+ b; M
glFlush();
. U0 |5 g& p' v" B& ~}  E" Z7 y, \. e
8 x/ q/ ~: {- [7 z) h; s) `
int main(int argc,char **argv){   5 F. J6 H9 \* D) ]
glutInit(&argc,argv);   0 u* s& i0 R( N% }" t8 }& z
glutCreateWindow("Hello,world!");   ) r/ h* q, c$ b' r$ f
glutDisplayFunc(display);   
3 O+ M8 ^% T4 R! X 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!

0 b# Y- M% z! ]1 w6 |5 _
/ M5 U( E) u' H+ S! {. N* y

7 |3 M# a* u; I5 c5 B
4 S$ d' A0 x; A7 N
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果
  F- ^+ G5 u" `
; v, a5 T9 M) C# y  P 2017-01-24 17-27-28屏幕截图.gif
: v! H5 D9 A1 Z- o$ X# h5 B, _
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c
1 R8 a9 B3 w9 m& Q  W6 S( e  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
! ]9 y$ N. T( `& B0 _*/) V. |, B3 L, J8 n8 y$ u% N/ z/ T
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/+ p/ j. _  x1 r9 ?: s6 ^% Q: a' z8 B
#include<GL/glut.h>8 v+ l8 [. t% O1 \
#include<stdlib.h>
! x" M. n' g2 H0 u" {' T6 h* g; T' ?- k3 V, y  v
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */5 y. L/ E3 B5 X
void init(void)9 n- p! Y: e8 J* n4 ?! A4 m  J
{
/ O& |7 ?% ~* H* m  M$ o% p    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};: @  F3 C8 y* r* ~3 v
    GLfloat mat_shininess[] = {50.0};
, H" m5 {0 T: l8 D3 Y" A; B    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
# |; {. K: q6 F) Z% v& g0 U8 L' a  [, o* ?* M
    glClearColor(0.0, 0.0, 0.0, 0.0);6 m7 }8 {+ o  O) Y
    glShadeModel(GL_SMOOTH);
6 p( l+ Z& U( P# C
+ C6 I' \8 Z" @8 X" ~    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);7 q& ]# D- d. L; I: m! K  T
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);0 B8 g: A# e6 h3 G
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
) `, v1 P: p- ?" a3 x
& d5 T, \$ N; k9 h4 `0 |    glEnable(GL_LIGHTING);
/ E5 p4 I. O2 ^7 Y    glEnable(GL_LIGHT0);
. ^  Y0 e  F; J2 X% m    glEnable(GL_DEPTH_TEST);; c; {/ s! S( h. v; q% M4 ]
}
8 X- Y% c& D& T- y9 T; x, c* ?! m
/*调用GLUT函数,绘制一个球*/6 P; B( x- Y, Q3 |; }' C
void display ( void )* v" o4 F* _. h! a; f
{
" a7 K, ?6 @; N- h5 M/ m    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
7 ~4 C! E9 r; i8 i% Y+ g    glutSolidSphere(1.0, 40, 50);
$ y$ p- R; o2 `8 S3 q9 ~+ C    glFlush();' n+ P7 K& }  I8 x) M% N2 j! B7 ?
}
7 c* P% t6 v  H7 s
  u' ~) N4 W# r1 j# ?- C9 t8 k( f: S
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/& e) c' D* O% |0 ?5 Y* s: a$ J
void reshape(int w, int h)" @. _6 g" k. ~5 y
{   
+ X1 G" q4 u% I( C2 T9 R# x    glViewport(0, 0, (GLsizei) w, (GLsizei) h);6 z2 s0 l, k- D5 p) s9 F+ X! n" z7 `
    glMatrixMode(GL_PROJECTION);' S* F; e( `  d
    glLoadIdentity();
9 \! V# i. S0 L, p    if (w <= h)
5 D; H' T, ^" X! E( {$ r" \        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
% j3 Q; N7 M* v; ]    else2 W- G2 P, [. Y  {$ ^
        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
6 Z/ T" `8 j9 i4 f    glMatrixMode(GL_MODELVIEW);- p* J3 _2 i9 x) `1 W
    glLoadIdentity();
- e  V: c& M! W8 S; V5 U+ }}
  A$ |3 i% T1 M/ t+ Z0 V) H) i* I% t) V; O; O, `
/* 定义对键盘的响应函数 */
9 W) |! d0 m: c4 j* _" ^void keyboard(unsigned char key, int x, int y)" F0 P2 h- y' ]+ `8 i& ]
{) \- H7 o% G+ J$ h3 u. P' H
    /*按Esc键退出*/1 I; T4 p# _* o6 v5 r( e
    switch(key)
/ T+ x$ k5 T- f# \0 `0 a# }    {2 v+ u$ [  N% G& V# q% f+ ]
        case 27:
8 b" o4 n& L. s4 ?) f6 d! M            exit(0);3 S( T% i  m- J" ?: F
        break;; E. C! Z/ A  T
    }$ g: v4 W; ]/ O# [
}; X9 k7 Z& X: P0 L

' C, Q4 Y, m0 o0 l. Q8 W3 G) f* y; ^9 A5 s6 E. C/ t
int main(int argc, char** argv)1 M. X4 c% b8 T2 b) c
{
- l/ }! B" m: {    /* GLUT环境初始化*/# _- l; k) _& K+ U1 i* r, g% J$ M
    glutInit(&argc, argv);. o1 B. z4 G3 k( `6 r! c# }
    /* 显示模式初始化 */
; o( i5 o) D% f/ @- ^8 f/ o  z    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);  A0 x, l( B7 y, f# R! e
    /* 定义窗口大小 */. h, k2 J7 U( I  ?7 D. K' ^
    glutInitWindowSize(300, 300);2 o7 B6 ^9 I# z& @4 p. K6 J2 ~
    /* 定义窗口位置 */4 o; _: h& n4 R5 ?, b: I; W& [
    glutInitWindowPosition(100, 100);7 R1 q1 r4 \" x
    /* 显示窗口,窗口标题为执行函数名 */3 z) Z1 A2 p$ `# S3 u1 m
    glutCreateWindow(argv[0]);
  i+ L, s  s; l' p    /* 调用OpenGL初始化函数 */" \! [9 M* B& J4 @
    init();
2 j. O/ d* u! a/ F    /* 注册OpenGL绘图函数 */0 X; F6 X5 r  V3 p3 `. |5 `( g3 r
    glutDisplayFunc(display);
0 }6 F8 A6 f+ ^* h- e3 Y    /* 注册窗口大小改变时的响应函数 */& c- v  B. C8 a! U% @& X+ t0 q8 V
    glutReshapeFunc(reshape);, P! H3 @/ Z4 P) S1 \
    /* 注册键盘响应函数 */
* l" ^" E4 W; @; N, F0 u4 }    glutKeyboardFunc(keyboard);
- v5 t) U* a5 T    /* 进入GLUT消息循环,开始执行程序 */
2 x( z% j4 q3 O9 f4 [% R    glutMainLoop();
: }4 S/ S7 L1 D* w, R- ^    return 0;
" r5 B  w; C2 n, F/ C}
% y  `% V5 r' ]& J' ^& u! _( q5 R' X! S1 U5 @- r0 k
                                                                                                                                     88,0-1       底端
  M7 V" S) _5 B- Y7 ]4 G. T% M  _  h4 X& s
编译' [' S7 s7 C: z* U8 U
g++ sphere.c -o sphere -lglut -lGL
6 X- |. U1 d& J( e5 o5 d) a- j* J( I$ o$ t, d) V" s: V& s1 E8 V

+ n9 J) }- p: U7 M' q
( g$ b) u# W" w; x6 L1 P2 U
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示
. h9 Z; x3 c* [1 W) u$ x( ]& w: }* t( n# H8 k, ~
2017-01-24 21-51-09屏幕截图.gif
9 {7 V$ ?# ^5 B9 h# e9 ]
回复

使用道具 举报

 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11) ; s$ o* ]) [- v/ ]" _
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-4-17 16:28 , Processed in 0.034654 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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