OpenGl红皮书第六版阅读笔记p107页实例

#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>

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);//点的坐标

 glColor3f(0.0,1.0,0.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)设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。
//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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值