OpenGL:绘制一个旋转的正方形
来源:互联网 发布:excel对应数据替换 编辑:程序博客网 时间:2024/04/28 09:09
使用OpenGL提供的双缓存技术,绘制一个旋转的正方形(动画)。
什么是双缓存技术?
我们可以这样理解,若将屏幕刷新的频率放慢到肉眼可见,如果不使用双缓存技术,那么当屏幕重新绘制时,绘制的过程人也是可以清除看到的,明显我们不希望这样。采用双缓存技术,就等于说画家有两块可擦画板,当第一块画板在观众面前显示时,画家立即在另外第二块画板上绘制另一幅画,屏幕刷新,画家立即将已经画好的画放到观众面前,再在幕后重绘第一块画板,这样只要画家绘画的过程就不会被观众看到,这时我们所期待的。
贴旋转正方形的代码:
#include<stdio.h>
#define GLUT_DISABLE_ATEXIT_HACK //不写这句话总运行出错,我也不知道为啥。。。
#include<gl/GLUT.h>
static GLfloat spin = 0.0;//static:静态全局变量,只要程序运行,内存中一直存在,文件内可见,文件外不可见
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);//将清空颜色设置为黑
glShadeModel(GL_FLAT);//OpenGL1.0提供的接口。作用:设置着色模式。参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存
glPushMatrix();//将当前矩阵压栈(保存现场)
glRotatef(spin,0.0,0.0,1.0);//旋转方向,遵循右手原则
glColor3f(1.0,1.0,1.0);
glRectf(-25.0,-25.0,25.0,25.0);
glPopMatrix();
glutSwapBuffers();//双缓存技术的函数,作用为交换两个缓冲区的指针
}
void spinDisplay(void)
{
spin = spin + 0.04;
if ( spin > 360.0)
{
spin = spin - 360.0;
}
glutPostRedisplay();//glutPostRedisplay 标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei) w,(GLsizei) h);//函数作用:用一个视景体截取图像
glMatrixMode(GL_PROJECTION);//mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,参数表示接下来要进行投影相关的操作
glLoadIdentity();//设置当前变化矩阵为单位矩阵;单位矩阵就是对角线上都是1,其余元素皆为0的矩阵。然后复位
glOrtho(-50.0,50.0,-50.0,50.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);//进行视景相关的操作
glLoadIdentity();
}
void mouse(int button,int state,int x,int y)
{
switch(button)
{
case GLUT_LEFT_BUTTON:
if(state == GLUT_DOWN)
glutIdleFunc(spinDisplay);//glutIdleFunc函数如果启用,这个idle function会被不断调用,直到有窗口事件发生
break;
case GLUT_RIGHT_BUTTON:
if(state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
//请求使用双缓存模式,注册响应鼠标事件的回调函数
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(250,250);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);//每次重绘场景时调用
glutReshapeFunc(reshape);//每次窗口改变时调用
glutMouseFunc(mouse);//每次使用鼠标时调用
glutMainLoop();
return 0;
}
运行截图:
- OpenGL:绘制一个旋转的正方形
- 一个简单的OpenGL程序,绘制一个白色正方形
- qt opengl lesson2 绘制一个三角形和一个正方形
- Opengl ES 学习笔记 2:绘制一个旋转的三角形
- 【菜鸟也能玩转OpenGL】OpenGL绘制正方形
- 用OpenGL绘制旋转的机器人手臂
- OpenGL绘制旋转茶壶
- OpenGL-绘制旋转立方体
- android opengl es 三角形、正方形自动旋转
- OpenGL程序:绘制正方形和三角形
- (DX绘制旋转正方形) 龙书 第三章 Direct3D中的绘制
- OpenGL——点的绘制(使用OpenGL来绘制可旋转坐标系的螺旋线)
- OpenGL绘制旋转三角形实例
- OpenGL绘制旋转立方体实例
- OpenGL绘制旋转三角形实例
- OpenGL绘制旋转立方体实例
- OpenGL绘制旋转立方体实例
- 绘制一个自动旋转的彩色圆盘
- Hadoop使用DATAJOIN软件包链接不同来源的数据
- Android 雷达扫描动画效果实现
- java中输入和输出重定向
- java编程思想第四版学习笔记-内部类
- 算法题的五种解法一——举例法
- OpenGL:绘制一个旋转的正方形
- 【慕课笔记】2-2 应用DOM方式解析XML—使用DOM解析XML文件的属性名和属性值
- 城觅知识点
- 如何给网站加入优雅的实时反爬虫策略
- awk 字符串替换 gsub
- 为什么要有this指针?(更新中)
- 适配器模式
- 杭电ACM1006
- 删除ArrayList集合中的元素(方法剖析)