CODE
#include <stdlib.h>
#include <GL/glut.h>
void background(void)
{
glClearColor(0.0 , 0.0 , 0.0 , 0.0);
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glShadeModel(GL_SMOOTH);
glColor3f(1.0 , 0.0 , 0.0);
glVertex2f(-1.0 , -1.0);
glColor3f(0.0 , 1.0 , 0.0);
glVertex2f(0.0 , -1.0);
glColor3f(0.0 , 0.0 , 1.0);
glVertex2f(-0.5 , 1.0);
glEnd();
glFlush();
}
void myReshape(GLsizei w , GLsizei h)
{
glViewport(0 , 0 , w , h);
glMatrixMode(GL_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);
}
int main(int argc , char ** argv)
{
glutInit(&argc , argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400 , 400);
glutInitWindowPosition(200 , 200);
glutCreateWindow("Triangle");
background();
glutReshapeFunc(myReshape);
glutDisplayFunc(myDisplay);
glutMainLoop();
return(0);
}
![这里写图片描述](https://img-blog.csdn.net/20170522231609378?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhZ3VhYnVmYWRhaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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值分别为-1和1, 而窗口的最上端, 最下端的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中数值的含义。
*/