OpenGL入门学习笔记(一)

OpenGL学习(一)


目录

[TOC]来生成目录:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值