一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4874|回复: 4

OpenGL for Linux

[复制链接]
发表于 2017-1-24 17:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-1-24 21:08 编辑
# Y% l* }( s; i
: g6 C9 f  O5 O8 \, c# M+ ~

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

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

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


$ T. G. n" i1 F: q6 j9 Y

sudo apt-get install freeglut3 freeglut3-dev  Z: D1 H$ `' m* Q* F- }
sudo apt-get install mesa-common-dev mesa-utils

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

#include <GL/glut.h>
( B' I& v0 |! ?' R) r, p( m& w( Yvoid display(){   
. ~$ }! u0 p# xglClear(GL_COLOR_BUFFER_BIT);   
' J  b) o+ U% n' \$ cglBegin(GL_POLYGON);     
5 I6 _2 z9 l, e/ P4 x; d' f$ I6 UglVertex2f(-0.5,-0.5);     
$ o& Y) y3 }' wglVertex2f(-0.5,0.5);     
/ I! _6 Z4 m- `3 x& V9 q) ~1 ^' i9 Y7 MglVertex2f(0.5,0.5);     * y" _0 m/ D/ w, E: J7 i
glVertex2f(0.5,-0.5);    3 d% [' _. ~! F- K1 r' o* f6 C
glEnd();   
2 z  }, u5 C$ @/ e7 l" QglFlush();1 p3 Y9 E% X, b5 O
}
* C- W/ k! {  Y+ H) |7 l$ z# ]5 B) E9 w" p/ D7 _1 ]4 U, m
int main(int argc,char **argv){   ; U. t7 ?6 `- E0 z% J
glutInit(&argc,argv);   
+ F: G& {. D' L# l glutCreateWindow("Hello,world!");   
! I6 s7 y) ~7 R# X4 L4 n glutDisplayFunc(display);   
' r# C5 {' X' e 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!

! v1 g' r/ l* q* S0 `( g4 O; \

7 }; _) m. Q. X3 {7 B1 e* D  Q0 @" Y5 H' i4 h
+ Z7 o: j3 b* T" b& w6 p
 楼主| 发表于 2017-1-24 18:06 | 显示全部楼层
出来的效果
3 J7 l' ]% H0 b1 O2 `7 O2 V# t2 z' O
2017-01-24 17-27-28屏幕截图.gif : f& e5 f, `8 ?/ _, a
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:35 | 显示全部楼层
/* sphere.c
+ C* ?' D3 [5 X, K* ^  此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
8 U) N! l1 L% N6 J5 `" l$ b3 P*/
$ ~3 l- b7 d* d6 h6 y/ N6 p- Y: V/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/2 C0 d7 l: Q* n1 p
#include<GL/glut.h>2 G4 P. E' K6 Q  H: {3 k& s
#include<stdlib.h># m' |% p6 s3 w
$ y# Z$ A% A2 P  C
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
) U+ p' T& X  v0 Y; J, Ivoid init(void)' S  J4 C/ h/ K
{
7 p; w6 @8 ^; |( \    GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
6 q/ }: y- j7 `8 f    GLfloat mat_shininess[] = {50.0};
0 W2 m5 e6 H! b0 e4 m6 F    GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};  D. \! V$ f2 q, i
0 l' r* ]- _9 t& A) c( s( y- J' z
    glClearColor(0.0, 0.0, 0.0, 0.0);
: |/ j7 W" {$ }8 V; r/ G2 X- q    glShadeModel(GL_SMOOTH);
& @. Q$ e$ P3 f) F( \4 z3 n9 W9 s9 ?8 P% v  r
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
. R/ t9 b2 @$ r    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
1 e8 B9 w; T* K8 T1 V    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
" e7 A' @- R# k+ B2 ~( b, \
5 A3 B8 o+ s' ^" u: V, L2 O8 a4 M    glEnable(GL_LIGHTING);5 Z: x. R8 e2 I
    glEnable(GL_LIGHT0);$ W, K) _& E; X4 J2 [: t; p
    glEnable(GL_DEPTH_TEST);
# ~+ A% E+ d) w( e& P}/ L4 N+ B5 v2 X. o1 n  R& e0 O

, ]7 ^' U' Z! o# [% K/*调用GLUT函数,绘制一个球*/
1 l) N' q8 T  d4 [# G6 P( J/ @2 ]void display ( void )
& _1 U5 `' R5 k5 s{
' N, Q/ r. f. @- ~# `. z: @5 K    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
* _3 E) d- e' Q! r! a3 N    glutSolidSphere(1.0, 40, 50);9 J  m/ g" c) Z2 D, p! n7 v
    glFlush();0 u5 _4 ]4 b1 w+ W
}1 \, {9 D: c5 ]
+ a" \: d" z2 ^$ W3 C

6 m- {8 Z' R3 C4 I$ @/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/  D* i* s8 E* H1 e" i. z/ Q
void reshape(int w, int h)
! p0 X4 h; P; v9 u+ Q; g8 _! {3 j{   
5 H! R" D# C! g6 V6 R) X& V3 Z    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
+ Q! V! J) l5 B' @& {    glMatrixMode(GL_PROJECTION);
4 T' b2 t5 X# K4 @    glLoadIdentity();
! y( y2 R- f- d/ C6 y    if (w <= h)6 G/ ^0 O+ w3 h' }7 K
        glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
" {+ _( f3 o, g# z+ F7 h. Q( h    else+ w+ [! H1 g0 j; S! S! ^
        glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);, ^/ l/ h0 Y# r# ]: ]" U( M
    glMatrixMode(GL_MODELVIEW);
3 r0 w' A1 G$ n" J3 E    glLoadIdentity();2 R4 T- ~" I. u4 {& S6 a. B
}, {8 O% g$ d; @6 q( p3 `* z# X

" N2 j: y) j6 U  {  Q/ t/* 定义对键盘的响应函数 */
& U# A" k, g5 m4 I8 F6 ~: Pvoid keyboard(unsigned char key, int x, int y)
7 P" F" H$ ]  Q  _9 L2 V& g{
9 N. G. U) f$ u$ n; Y' Y$ j    /*按Esc键退出*/
: q" w9 m4 \% G# N1 h  y+ H    switch(key)
' n8 |! z7 [9 W$ g  C3 B: N    {  ~3 M7 ^9 o, h. Q. ~0 z+ m
        case 27:+ u) K( R: G1 v. I' G2 y
            exit(0);
/ x! e- M9 o' _" e: m0 S" X        break;& x  ~# _# t* p  f
    }4 p7 y6 b/ F" U  J
}
, T: v: @. j8 d
% s4 r$ a6 U" }4 m' ^( i4 M5 |2 P, n5 Y3 \1 [+ R1 G
int main(int argc, char** argv)
7 N- A; K' @! r' d{
. J1 d0 z% f) r- n% F6 d    /* GLUT环境初始化*/7 Z$ X/ F1 @1 o8 E# L1 P
    glutInit(&argc, argv);
! N6 V' O9 J+ M% d6 y! m7 |    /* 显示模式初始化 */2 q; v$ T3 @  e: V5 L0 R
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);4 O7 ~) f3 Q- a, y. X$ ]7 S
    /* 定义窗口大小 */
( y3 X& E! ]: b  }4 E, }    glutInitWindowSize(300, 300);% q6 U) d: |; V7 M: w2 U# ^
    /* 定义窗口位置 */# m9 g# e4 P! R7 C
    glutInitWindowPosition(100, 100);0 _$ W  x6 a; A
    /* 显示窗口,窗口标题为执行函数名 */
  v" S: E6 N* E% `    glutCreateWindow(argv[0]);
4 u6 ]9 n, f  W7 O6 q% E' {    /* 调用OpenGL初始化函数 */$ h+ L, S0 A0 C2 O* E5 }
    init();2 W/ F$ }$ u0 l* J) p+ W0 X- i1 S
    /* 注册OpenGL绘图函数 */
( d% D% _# C  ^, f( t% L6 Q    glutDisplayFunc(display);7 y5 Y3 I9 p* D
    /* 注册窗口大小改变时的响应函数 */
$ V4 r0 i& L8 w3 V; O! ^. w& R6 e    glutReshapeFunc(reshape);
8 ^9 L4 E/ n! N/ m0 k) B0 ~    /* 注册键盘响应函数 */
) V8 `6 z  {: W, L    glutKeyboardFunc(keyboard);
- S6 S8 U2 o. v- x8 C7 K; o    /* 进入GLUT消息循环,开始执行程序 */6 e) M0 z* ~; A5 b
    glutMainLoop();* o8 J' j' M7 x. u
    return 0;  r) n# p" _3 }! p( p, c
}
+ ~- k; r$ @& E) z
" z- _! J5 ~% T                                                                                                                                     88,0-1       底端- P$ ]8 L. O: V/ J, F  |

% u2 N$ H& R( C' j( C+ ^编译
- w9 [, w# `+ J9 Kg++ sphere.c -o sphere -lglut -lGL, m, q9 N  n/ m) S; O

" u7 h% N5 S( p; ?. Z) k
* Z" r" S1 D- A4 N& h. r. C2 c3 G) o
回复

使用道具 举报

 楼主| 发表于 2017-1-24 21:56 | 显示全部楼层
效果展示! H3 W8 w9 S$ [8 L: [

/ O3 U' B7 _$ l7 S5 _/ n 2017-01-24 21-51-09屏幕截图.gif
/ [% u2 S$ v" N5 H, ]" B2 e2 p6 K
回复

使用道具 举报

 楼主| 发表于 2017-1-25 22:28 | 显示全部楼层
OpenGL ES 2.0 编程指南 中文版.pdf (2.31 MB, 下载次数: 11) ! `8 ~+ X8 M9 H2 L8 F! ~" N
回复

使用道具 举报

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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