Learn1_彩色三角形

CODE

#include <stdlib.h>
#include <GL/glut.h>
/*
Learn1:本例在黑色的背景下绘制一个彩色的三角形!
*/
void background(void)
{
    glClearColor(0.0 ,  0.0 ,  0.0 ,  0.0);//设置背景颜色为黑色
}

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写
    glBegin(GL_TRIANGLES);//开始画三角形triangles
    glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
    glColor3f(1.0 ,  0.0 ,  0.0);//设置第一个顶点为红色
    glVertex2f(-1.0 ,  -1.0);//设置第一个顶点的坐标为( -1.0 , -1.0)
    glColor3f(0.0 ,  1.0 ,  0.0);//设置第二个顶点为绿色
    glVertex2f(0.0 ,  -1.0);//设置第二个顶点的坐标为( 0.0 , -1.0)
    glColor3f(0.0 ,  0.0 ,  1.0);//设置第三个顶点为蓝色
    glVertex2f(-0.5 ,  1.0);//设置第三个顶点的坐标为( -0.5 , 1.0)
    glEnd();//三角形结束
    glFlush();//强制OpenGL函数在有限时间内运行
}

void myReshape(GLsizei w ,  GLsizei h)
{
    glViewport(0 ,  0 ,  w ,  h);//设置视口
    glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION(projection)
    glLoadIdentity();//将当前矩阵置换为单位阵
    if(w <= h)
        gluOrtho2D(-1.0 ,  1.5 ,  -1.5 ,  1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵
    else
        gluOrtho2D(-1.0 ,  1.5*(GLfloat)w/(GLfloat)h ,  -1.5 ,  1.5);
        glMatrixMode(GL_MODELVIEW);//指明当前矩阵为 GL_MODELVIEW(modelview)
}

int main(int argc ,  char ** argv)
{
    /*初始化*/
    glutInit(&argc ,  argv);//初始化GLUT库并同窗口系统对话协商。
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//确定所创建窗口的显示模式,这儿参数GLUT_SINGLE指定单缓存窗口,这也是缺省模式。
    //对应的模式GLUT_DOUBLE为双缓存窗口。
    //参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式。对应的模式GLUT_INDEX为颜色索引模式窗口。
    glutInitWindowSize(400 ,  400);//初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。
    glutInitWindowPosition(200 ,  200);//设置初始窗口位置,第一个参数为窗口左上角x的坐标,第二个参数为窗口左上角y的坐标,以像素为单位。
    /*创建窗口*/
    glutCreateWindow("Triangle");//创建顶层窗口,窗口的名字为扩号中的参数。
    /*绘制与显示*/
    background();//这是自己写的函数,设置背景。其实这个函数中的语句可以写在display函数中,但为使功能块更清晰,所以把背景这部分单独提出
    glutReshapeFunc(myReshape);//注册当前窗口的形状变化回调函数。当改变窗口大小时,该窗口的形状改变回调函数将被调用。
    //在此例中就是myReshape指定形状变化函数。
    glutDisplayFunc(myDisplay);//注册当前窗口的显示回调函数。当一个窗口的图像层需要重新绘制时, GLUT将调用该窗口的显示回调函数。
    //在此例中的mydisplay就是显示回调函数,显示回调函数不带任何参数,它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。
    glutMainLoop();//进入GLUT事件处理循环。glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回;
    //并且调用注册过的回调函数,所以这个函数必须放在注册回调函数的后面,此例中为glutReshapeFunc,glutDisplayFunc。
    return(0);

/*
main函数中以glut开头的函数都包含在glut.h中。 GLUT库的函数主要执行如处理多窗口绘制、
处理回调驱动事件、生成层叠式弹出菜单、绘制位图字体和笔画字体,以及各种窗口管理等任务.
*/

}

这里写图片描述

SUMMARY

/*
summary:
OpenGL程序的典型的程序结构:
首先初始化,包括对 GLUT库的初始化和对窗口的设置及显示模式的设置。
第二,创建窗口。
第三,自己创作的核心部分。
第四, glutMainLoop 进入GLUT事件处理循环。

第五,下面我们转到我们的创作核心。
1).background这个函数很简单, 只有一行语句。glClearColor中的四个参数分别是红、绿、蓝和alpha值。
这些值定义了窗口的颜色,这些值的范围在[0, 1]之间,缺省值均为0。你可以改变这些值,观察背景色彩的变化。

2).glClear 将buffers设置为预先设定的值。参数GL_COLOR_BUFFER_BIT表明现在可以向buffer中写入颜色值。

3).glBegin和glEnd是一一对应的。这两个函数限制了一组或多组图元的顶点定义。在这两个函数中间就是你所绘制
的由多个顶点组成的图元,函数的参数表明了所绘制的图元的类型。本例中的GL_TRIANGLES表明所绘制的图形为三角形。

4).glShadeModel选择平坦或光滑渐变模式。GL_SMOOTH为缺省值,为光滑渐变模式, GL_FLAT为平坦渐变模式。

5).glColor设置当前颜色,后面跟的数字为参数个数, 3表明有三个参数, 分别为红、 绿、 蓝, 4则多一个参数alpha。
紧跟数字后面的字母表示数据类型。本例中的glColor3f表示三个参数,数据类型为GLfloat。

6).glVertex指定顶点。同样函数明中的数字表明参数个数。参数分别为 x, y或x、 y、 z。紧跟数字后面的字母表示数据类型。
本例中glVertex2f表明两个参数,数据类型为 GLfloat。窗口的中心为原心,坐标为( 0, 0, 0)。横坐标向左为负,向右为正;
纵坐标向上为正,向下为负; z坐标向屏幕里为负,屏幕外为正,坐标系符合右手定则。
现在你将main函数中的glutReshapeFunc(myReshape); 注释掉,任意改变三角形顶点的坐标你会发现窗口的最左边, 
最右边的x值分别为-11, 而窗口的最上端, 最下端的y值分别为1和-1。 由此可见glVertex中坐标的值实际上是和窗口的大小成倍数的关系。
好了,现在恢复原来的程序。

7).glFlush迫使OpenGL函数在有限时间里运行。glFlush清空所有buffer,使所有发出的命令能在规定的时间内运行。
一定不能忘记这一条语句。只有加了这一句,前面的命令才能执行。myReshape 改变窗口的大小。

8).glViewport( Glintx, Glinty, GLsizeiwidth, GLsizeiheight) 设置视口。 视口是一个矩形, x, y为视口左下角的
坐标,以像素为单位,缺省值为( 0 , 0)。 width和height分别为视口的宽和高。 OpenGl context第一次贴到窗口上时
width和height分别设置成窗口的大小。

9).glMatrixMode 指明哪一个矩阵为当前矩阵。本例中 GL_PROJECTION指明投影矩阵堆栈为随后的矩阵操作的目
标。 GL_MODELVIEW指明模型视景矩阵。

10).glLoadIdentity将当前矩阵置换为单位阵。

11).gluOrtho2D( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)定义二维正视投影矩阵。 
left,right分别设置左右垂直切平面的坐标, bottom, top分别设置上下垂直切平面的坐标。现在你可能对这几个参数的意义还不是很清楚。 
我们现在将myReshape 函数glLoadIdentity();后面所有的语句注释掉,
加上gluOrtho2D(-1.5 , 1.5 , -1.5 , 1.5);改变三角型的坐标及gluOrtho2D中的数值, 你就可以清楚的理解gluOrtho2D中数值的含义。

*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值