OpenGL学习日记1状态管理和绘制几何物体
2016-03-14 16:10
369 查看
清除窗口 Clear the window
目的:绘制新场景时一般需要将背景清除为某一种颜色。
函数:glClearColor(R,G,B,alpha);//设置当前清除颜色
glClear(Buffer Name);//颜色缓冲区:GL_COLOR_BUFFER_BIT; 深度缓冲区:GL_DEPTH_BUFFER_BIT;
累积缓冲区:GL_ACCUM_BUFFER_BIT; 模板缓冲区:GL_STENCIL_BUFFER_BIT。
对每一个想要清除的缓冲区都需要设置相应的清除值,颜色就是glClearColor();深度是glClearDepth();按照此命名方式以此类推。
可以同时清除多个缓冲区,在glClear( )中将Buffer的名字用“|“连接,表示逻辑or。同时清除缓冲区往往会比线性清除缓冲区高效。
例子:同时清除 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
线性清除 glClear(GL_DEPTH_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT);
指定颜色 Specifying a Color
因为OpenGL是状态机,所以每一次绘制一个物体或场景时就需要设置一次需要的颜色。这里只学习简单的设置颜色,不考虑光照条件等。现在只考虑设置当前颜色。
函数:glColor4f(R,G,B,alpha);//函数名的命名很有意思,glColor(表示对颜色的设置)+3|4(表示参数个数,4个参数时多了alpha)+f(表示参数类型是浮点数)
常用的OpenGL颜色值://现在暂时不考虑alpha的值。
黑色0.0 0.0 0.0
红色1.0 0.0 0.0
绿色0.0 1.0 0.0
蓝色0.0 0.0 1.0
黄色1.0 1.0 0.0
青色0.0 1.0 1.0
白色1.0 1.0 1.0
强制完成绘图操作 Forcing Completion of Drawing
目的:强制刷新,保证绘图命令将被执行而不是在缓冲区中等待。
函数:
glFlush(void);//有时图画不出来,用flush强制冲出来。强制以前所发出的OpenGL命令开始执行。
glFinish(void);//强制以前所发出的OpenGL命令完成执行。
坐标系统工具箱
在刚打开窗口、移动和改变窗口大小时,计算机都需要重新绘制一次刚刚绘制的图形,这就需要重新调用一次刚刚绘制这个图形的代码。也就是说应该把重绘场景所需要的所有的代码放到回调函数里。
上面说的过程,GLUT会自动执行,只需在glutReshapeFunc()中注册回调函数。
Reshape回调函数
void reshape(int w, int h) {具体见课本}
上课的时候老师演示程序,在回调函数reshape()那里设置了断点,在一开始绘制图形时,程序运行到这一行时就会停下,在调整窗口大小或者移动窗口时也会在设置的断点处停下。问过师姐之后才回忆起来。好像对这个回调函数理解了。之后应该自己调试一下,设置一下断点,看一下是不是这么一回事。
程序练习1:
目的:绘制新场景时一般需要将背景清除为某一种颜色。
函数:glClearColor(R,G,B,alpha);//设置当前清除颜色
glClear(Buffer Name);//颜色缓冲区:GL_COLOR_BUFFER_BIT; 深度缓冲区:GL_DEPTH_BUFFER_BIT;
累积缓冲区:GL_ACCUM_BUFFER_BIT; 模板缓冲区:GL_STENCIL_BUFFER_BIT。
对每一个想要清除的缓冲区都需要设置相应的清除值,颜色就是glClearColor();深度是glClearDepth();按照此命名方式以此类推。
可以同时清除多个缓冲区,在glClear( )中将Buffer的名字用“|“连接,表示逻辑or。同时清除缓冲区往往会比线性清除缓冲区高效。
例子:同时清除 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
线性清除 glClear(GL_DEPTH_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT);
指定颜色 Specifying a Color
因为OpenGL是状态机,所以每一次绘制一个物体或场景时就需要设置一次需要的颜色。这里只学习简单的设置颜色,不考虑光照条件等。现在只考虑设置当前颜色。
函数:glColor4f(R,G,B,alpha);//函数名的命名很有意思,glColor(表示对颜色的设置)+3|4(表示参数个数,4个参数时多了alpha)+f(表示参数类型是浮点数)
常用的OpenGL颜色值://现在暂时不考虑alpha的值。
黑色0.0 0.0 0.0
红色1.0 0.0 0.0
绿色0.0 1.0 0.0
蓝色0.0 0.0 1.0
黄色1.0 1.0 0.0
青色0.0 1.0 1.0
白色1.0 1.0 1.0
强制完成绘图操作 Forcing Completion of Drawing
目的:强制刷新,保证绘图命令将被执行而不是在缓冲区中等待。
函数:
glFlush(void);//有时图画不出来,用flush强制冲出来。强制以前所发出的OpenGL命令开始执行。
glFinish(void);//强制以前所发出的OpenGL命令完成执行。
坐标系统工具箱
在刚打开窗口、移动和改变窗口大小时,计算机都需要重新绘制一次刚刚绘制的图形,这就需要重新调用一次刚刚绘制这个图形的代码。也就是说应该把重绘场景所需要的所有的代码放到回调函数里。
上面说的过程,GLUT会自动执行,只需在glutReshapeFunc()中注册回调函数。
Reshape回调函数
void reshape(int w, int h) {具体见课本}
上课的时候老师演示程序,在回调函数reshape()那里设置了断点,在一开始绘制图形时,程序运行到这一行时就会停下,在调整窗口大小或者移动窗口时也会在设置的断点处停下。问过师姐之后才回忆起来。好像对这个回调函数理解了。之后应该自己调试一下,设置一下断点,看一下是不是这么一回事。
程序练习1:
// GL_ex1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<glut.h> void display()//在这里添加断点 { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,0.0); glBegin(GL_POLYGON); glVertex3f(0.25,0.25,0.0); glVertex3f(0.75,0.25,0.0); glVertex3f(0.75,0.75,0.0); glVertex3f(0.25,0.75,0.0); glEnd(); glFlush(); } void init() { glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0); } int _tmain(int argc, char** argv)//修改了这里面的参数 { glutInit(&argc,argv);//这里是什么意思? glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(250,250); glutInitWindowPosition(100,100); glutCreateWindow("ex1"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }
相关文章推荐
- Openstack Generate image
- Openstack liberty install
- 初探Docker
- VmWare下安装CentOS6
- 如何查看Linux 版本/内核(方法与实例)
- 分享零基础学习Hadoop方法
- How to generate a local image from openstack
- 关于PHP安装中遇到的错误分析--无法启动wampapache服务
- Linux性能监控工具nmon在SecureCRT下乱码解决方法
- 好的架构源于不停地衍变,而非设计
- Shell命令
- Linux笔记(35)——yum在线安装
- opengl三角形剖分与三角形条带化
- 初学opengl(三) 通过dart throwing的思想进行点采样
- 大流量的网站如何优化
- linux TC
- Tomcat 6 和 7 的区别
- Python代码追踪(类似于bash -x的效果)
- 怎样搭建大型网站
- Cobbler自动安装*nix系统