opengl学习笔记(一)

ubuntu下opengl的安装及配置

 


 

OpenGL 是一套由SGI公司发展出来的绘图函数库,它是一组 C 语言的函数,用于 2D 与 3D 图形应用程序的开发上。OpenGL 让程序开发人员不需要考虑到各种显示卡底层运作是否相同的问题,硬件由 OpenGL 核心去沟通,因此只要显示卡支援 OpenGL,那么程序就不需要重新再移植,而程序开发人员也不需要重新学习一组函数库来移植程序。

安装

首先不可或缺的就是编译器与基本的函数库,如果系统没有安装的话,依照下面的方式安装:

sudo apt-get install build-essential

安装OpenGL Library

 1 sudo apt-get install libgl1-mesa-dev 

安装OpenGL Utilities

 1 sudo apt-get install libglu1-mesa-dev 

OpenGL Utilities 是一组建构于 OpenGL Library 之上的工具组,提供许多很方便的函数,使 OpenGL 更强大且更容易使用。

安装OpenGL Utility Toolkit

 1 sudo apt-get install libglut-dev 

OpenGL Utility Toolkit 是建立在 OpenGL Utilities 上面的工具箱,除了强化了 OpenGL Utilities 的不足之外,也增加了 OpenGL 对于视窗介面支援。
      注意:在这一步的时候,可能会出现以下情况,shell提示:

将上述$ sudo apt-get install libglut-dev命令改成$ sudo apt-get install freeglut3-dev即可。

测试

 


 

示例test.c源码:

#include <GL/glut.h>


void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glOrtho(-5, 5, -5, 5, 5, 15);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);

    return;
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0, 0);
    glutWireTeapot(3);
    glFlush();

    return;
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(300, 300);
    glutCreateWindow("OpenGL 3D View");
    init();
    glutDisplayFunc(display);
    glutMainLoop();

    return 0;
}

编译程序时,执行以下指令:

$ gcc -o test test.c -lGL -lGLU -lglut

执行:

$ ./test

程序运行结果

初始化一个窗口,并在窗口中绘制一个茶壶

源码分析:

1.初始化和创建窗口

在打开窗口之前,必须指定窗口的特征。它是单缓存的还是双缓冲的?它把颜色存储为RGBA值还是颜色索引值?它应该出现在显示屏幕的什么位置?为了在应用程序中指定这些问题的答案,在使用glutCreateWindows()函数打开窗口之前,分别必须调用glutInit(),glutInitdisplayMode(),glutInitWindowSize(),和glutInitWindowPosition函数。


void glutInit( int argc, char** argv)

在调用其它任何GLUT函数之前首先要调用这个函数,它对GLUT函数库进行初始化。这个函数的参数值应与main()函数相同。

 

void glutInitDisplayMode(unsigned int mode);

指定glutCreateWindow()函数将要创建的的窗口的显示模式(例如使用RGBA还是颜色索引,使用单缓冲区还是双缓冲等)。另外,它还可以指定与这个窗口相关联的深度缓冲区,模板缓冲区,和累积缓冲区。mode参数的值是GLUT_RGBA(或GLUT_INDEX),GLUT_SINGLE(或GLUT_DOUBLE)以及缓冲区启用标记(GLUT_DEPTH, GLUT_STENCIL, GLUT_ACCUM)的按位OR组合。这个参数的默认值为GLUT_RGBA | GLUT_SINGLE(使用RGBA模式和单缓冲)。

 

void glutInitWindowPosition( int x, int y);

void glutInitWindowSize( int width, int height );

请求glutCreateWindow()函数创建的窗口具有指定的大小和位置。

 

int glutCreateWindow(char *name);

打开一个具有以上设置的特征(显示模式,宽度,高度等)的窗口。如果窗口系统支持,name字符串可以出现在窗口的标题栏上。进入glutMainLoop()之前,这个窗口并不会显示,因此在显示窗口之前不要在窗口中进行渲染。

 2. 处理窗口和输入事件

 


 

在窗口创建之后,但是在进入主循环之前,应该使用下面这些函数注册相关的回调函数。

void glutDisplayFunc( void(*func)(void));

指定了当窗口的内容需要重新绘制时将要调用的函数。在发生下面这些情况时,窗口就需要进行重绘:窗口刚打开,窗口弹出,窗口的内容遭到破坏,以及显示的调用了glutPostRedisplay()函数。

 

3.初始化和绘制三维物体

GLUT提供了很多绘图函数。这些函数都是在立即模式下渲染所有的几何图形。每个三维物体可以采用以下两种风格之一:没有表面法线的线框模式和具有着色和法线的实心形式。需要使用光照的时候,必须使用实心模式。只有绘制茶壶模型的函数能够生成纹理坐标。

void glutWireTeapot(GLdouble size);

void glutWireTeapot(GLdouble size);

分别用来绘制茶壶的线框形式和实心形式。

4.运行程序

在完成设置之后,GLUT程序就进入事件处理循环glutMainLoop()

 

posted @ 2018-06-12 16:54  feifanren  阅读(481)  评论(0编辑  收藏  举报