#include <windows.h>//Microskft Windows要求在gl.h或glu.h之前包含windows.h头文件,因为Microsoft Windows版本的和文件内部所使用的一些宏是在Window.h中定义的。
#include<GL/gl.h>//若不加上一项,则glShadeModel (GL_FLAT)就无法识别
#include <GL/glut.h>
#include<GL/gl.h>//若不加上一项,则glShadeModel (GL_FLAT)就无法识别
#include <GL/glut.h>
void init (void)//将只需要调用一次的操作(设置背景颜色和坐标系统),放入其中
{
glClearColor(0.0,0.0,0.0,0.0);//将窗口清成黑色
glShadeModel(GL_SMOOTH);//设置着色模式,参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。在使用光滑着色时(即GL_SMOOTH),独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过差值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色差值得到。
}
void Triangle (void)//绘制三角形
{
glBegin(GL_TRIANGLES);
glColor3f(1.0,0.0,0.0);//红
glVertex2f(25.0,5.0);//点的坐标
{
glClearColor(0.0,0.0,0.0,0.0);//将窗口清成黑色
glShadeModel(GL_SMOOTH);//设置着色模式,参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。在使用光滑着色时(即GL_SMOOTH),独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过差值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色差值得到。
}
void Triangle (void)//绘制三角形
{
glBegin(GL_TRIANGLES);
glColor3f(1.0,0.0,0.0);//红
glVertex2f(25.0,5.0);//点的坐标
glColor3f(0.0,1.0,0.0);//绿
glVertex2f(5.0,5.0);
glVertex2f(5.0,5.0);
glColor3f(0.0,0.0,1.0);//蓝
glVertex2f(5.0,25.0);
glEnd();
}
void display(void)//用于渲染场景(并可能需要重新渲染)的操作放在这里面,也是用于回调函数的函数。
{
glClear(GL_COLOR_BUFFER_BIT);//实际完成清除窗口的任务
Triangle();//画三角形
glFlush();//绘图命令将被实际执行
}
void reshape(int w,int h)//reshape回调函数,参考p21用于重新建立一个矩形区域,把它作为新的渲染画布
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);//用于调整绘图的像素矩形,使它占据整个新窗口。
glMatrixMode(GL_PROJECTION);//glMatrixMode设置当前矩阵模式:projection对投影矩阵应用随后的矩阵操作.
glLoadIdentity();//glMatrixMode与glLoadIdentity()一同使用gl,LoadIdentity():将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作.在glLoadIdentity()之后我们为场景设置了透视图。glMatrixMode(GL_MODELVIEW)设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。
glVertex2f(5.0,25.0);
glEnd();
}
void display(void)//用于渲染场景(并可能需要重新渲染)的操作放在这里面,也是用于回调函数的函数。
{
glClear(GL_COLOR_BUFFER_BIT);//实际完成清除窗口的任务
Triangle();//画三角形
glFlush();//绘图命令将被实际执行
}
void reshape(int w,int h)//reshape回调函数,参考p21用于重新建立一个矩形区域,把它作为新的渲染画布
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);//用于调整绘图的像素矩形,使它占据整个新窗口。
glMatrixMode(GL_PROJECTION);//glMatrixMode设置当前矩阵模式:projection对投影矩阵应用随后的矩阵操作.
glLoadIdentity();//glMatrixMode与glLoadIdentity()一同使用gl,LoadIdentity():将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作.在glLoadIdentity()之后我们为场景设置了透视图。glMatrixMode(GL_MODELVIEW)设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。
//glM,glL,gluO这三行代码,调整用于绘图的坐标系统,使左下角的坐标是(0,0),右上角的坐标是(w,h)
if(w<=h)
gluOrtho2D(0.0,30.0,0.0,30.0*(GLfloat) h/(GLfloat) w);
else
gluOrtho2D(0.0,30.0*(GLfloat) w/(GLfloat) h,0.0,30.0);
glMatrixMode(GL_MODELVIEW);///GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
}
int main (int argc,char**argv)//GLUT通过五个函数执行初始化窗口所需要的任务
{
glutInit(&argc,argv);//它应该在调用其他任何GLUT函数之前被调用。用于对GLUT进行初始化,并处理所有的命令行参数
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//指定了使用RGBA模式还是颜色索引模式,还指定了是使用单缓冲还是双缓冲窗口
glutInitWindowSize(500,500);//指定了窗口的大小,以像素为单位
glutInitWindowPosition(100,100);//指定了窗口左上角的屏幕位置
glutCreateWindow(argv[0]);//创建一个支持OPENGL渲染环境的窗口。
glutDisplayFunc(display);//当GLUT确定一个窗口的内容需要重新显示时,通过它所注册的回调函数就会被执行。因此,应该把重绘场景所需要的所有代码都放在这个回调函数里,本例子就是display函数。
glutReshapeFunc(reshape);//表示当窗口的大小发生改变时应该采取什么行动。即重绘。
glutMainLoop();//在调用它之前,glutCreateWindow (argv[0]),并没有被显示。调用它来启动程序。
return 0;
}
if(w<=h)
gluOrtho2D(0.0,30.0,0.0,30.0*(GLfloat) h/(GLfloat) w);
else
gluOrtho2D(0.0,30.0*(GLfloat) w/(GLfloat) h,0.0,30.0);
glMatrixMode(GL_MODELVIEW);///GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
}
int main (int argc,char**argv)//GLUT通过五个函数执行初始化窗口所需要的任务
{
glutInit(&argc,argv);//它应该在调用其他任何GLUT函数之前被调用。用于对GLUT进行初始化,并处理所有的命令行参数
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//指定了使用RGBA模式还是颜色索引模式,还指定了是使用单缓冲还是双缓冲窗口
glutInitWindowSize(500,500);//指定了窗口的大小,以像素为单位
glutInitWindowPosition(100,100);//指定了窗口左上角的屏幕位置
glutCreateWindow(argv[0]);//创建一个支持OPENGL渲染环境的窗口。
glutDisplayFunc(display);//当GLUT确定一个窗口的内容需要重新显示时,通过它所注册的回调函数就会被执行。因此,应该把重绘场景所需要的所有代码都放在这个回调函数里,本例子就是display函数。
glutReshapeFunc(reshape);//表示当窗口的大小发生改变时应该采取什么行动。即重绘。
glutMainLoop();//在调用它之前,glutCreateWindow (argv[0]),并没有被显示。调用它来启动程序。
return 0;
}