OpenGL入门学习笔记(一)

来源:互联网 发布:g11s变频器的数据复写 编辑:程序博客网 时间:2024/06/05 22:41

OpenGL学习(一)


目录

[TOC]来生成目录:

  • OpenGL学习一
      • 目录
    • OpenGl特性
      • OpenGL入门实例
      • GlUT工具包提供的几个函数
      • 实例绘制简单的几何图形
        • 一指定顶点
        • 二指定定点的命令
        • 三画圆

OpenGl特性

OpenGL 作为当前主流的图形 API 之一,它在一些场合具有比 DirectX 更优越的特性。
1、与 C 语言紧密结合。
OpenGL 命令最初就是用 C 语言函数来进行描述的,对于学习过 C 语言的人来讲,OpenGL 是容易理解和
学习的。如果你曾经接触过 TC 的 graphics.h,你会发现,使用 OpenGL 作图甚至比 TC 更加简单。
2、强大的可移植性。
微软的 Direct3D 虽然也是十分优秀的图形 API,但它只用于 Windows 系统(现在还要加上一个 XBOX 游
戏机)。而 OpenGL 不仅用于 Windows,还可以用于 Unix/Linux 等其它系统,它甚至在大型计算机、各种
专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是
平台无关。
3、高性能的图形渲染。
OpenGL 是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对 OpenGL 提供强力支持,激烈
的竞争中使得 OpenGL 性能一直领先。
总之,OpenGL 是一个很 NB 的图形软件接口。至于究竟有多 NB,去看看 DOOM3 和 QUAKE4 等专业游戏就知道了。

OpenGL 官方网站(英文)
http://www.opengl.org

OpenGL入门实例

#include <GL/glut.h>void myDisplay(void){    glClear(GL_COLOR_BUFFER_BIT);    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);    glFlush();}int main(int argc, char *argv[]){    glutInit(&argc, argv);    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);    glutInitWindowPosition(100, 100);    glutInitWindowSize(400, 400);    glutCreateWindow("第一个 OpenGL 程序");    glutDisplayFunc(&myDisplay);    glutMainLoop();    return 0;}

该程序的作用是在一个黑色的窗口中央画一个白色的矩形

GlUT工具包提供的几个函数

函数 含义 glutInit 对 GLUT 进行初始化,这个函数必须在其它的 GLUT 使用之前调用一次。其格式比较死板 glutInitDisplayMode 设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE 表示使用单缓冲,与之对应的还有 GLUT_DOUBLE(使用双缓冲) glutInitWindowPosition 设置窗口在屏幕中的位置 glutInitWindowSize 设置窗口的大小 glutCreateWindow 根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用 glutMainLoop 才能看到窗口 glutDisplayFunc 设置一个函数,当需要进行画图时,这个函数就会被调用 glutMainLoop 进行一个消息循环
函数 意义 glRectf 画一个矩形,四个参数分别表示了位于对角线的两个点的横从坐标 glClear 清除。GL_COLOR_BUFFER_BIT 表示清除颜色,glClear 函数还可以清除其它的东西,但这里不作介绍 glFlush 保证前面的 OpenGL 命令立即执行(而不是让它们在缓冲区中等待)。其作用跟 fflush(stdout)类似。

实例:绘制简单的几何图形

  • OpenGL中的点被画成单个的像素
  • OpenGL中规定,一个多边形必须是一个凸多边形(如果使用的多边形不是凸多边形,则最后输出的效果是未定义的)可以尽量使用三角形

(一)指定顶点

以 glVertex开头,后面跟一个数字和 1~2 个字母。

例如: glVertex2d glVertex3f glVertex3fv
数字表示参数的个数,2 表示有两个参数,3 表示三个,4 表示四个(我知道有点罗嗦~)。

字母表示参数的类型,s 表示 16 位整数(OpenGL 中将这个类型定义为 GLshort),

  • i 表示 32 位整数(OpenGL 中将这个类型定义为 GLint 和 GLsizei),
  • f 表示 32 位浮点数(OpenGL中将这个类型定义为 GLfloat 和 GLclampf),
  • d 表示 64 位浮点数(OpenGL 中将这个类型定义为 GLdouble
  • v 表示传递的几个参数将使用指针的方式,见下面的例子。

这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能相同

glVertex2i(1, 3);glVertex2f(1.0f, 3.0f);glVertex3f(1.0f, 3.0f, 0.0f);glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};glVertex3fv(VertexArr3);

(二)指定定点的命令

指定顶点的命令必须包含在 glBegin 函数之后,glEnd 函数之前(否则
指定的顶点将被忽略)。并由 glBegin 来指明如何使用这些点。

glBegin(GL_POINTS);glVertex2f(0.0f, 0.0f);glVertex2f(0.5f, 0.0f);glEnd();

这两个点将会分别画出来,如果将 GL_POINTS 替换成 GL_LINES,则两个点将被认为是直线的两个端点,OpenGL 将会画出一条直线。

glBegin 支持的方式除了 GL_POINTS 和 GL_LINES,还有 GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN 等

void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glBegin( /* 在这里填上你所希望的模式 */ );/* 在这里使用 glVertex*系列函数 *//* 指定你所希望的顶点位置 */glEnd();glFlush();}

(三)画圆

#include <GL/glut.h>#include <math.h>const int n = 20;const GLfloat R = 0.5f;const GLfloat Pi = 3.1415926536f;void myDisplay(void){    int i;    glClear(GL_COLOR_BUFFER_BIT);    glBegin(GL_POLYGON);    for(i=0; i<n; ++i)    glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i));    glEnd();    glFlush();}int main(int argc, char *argv[]){    glutInit(&argc, argv);    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);    glutInitWindowPosition(100, 100);    glutInitWindowSize(400, 400);    glutCreateWindow("第一个 OpenGL 程序");    glutDisplayFunc(&myDisplay);    glutMainLoop();    return 0;}
1 0