您的位置:首页 > 运维架构

opengl之双缓冲—旋转的矩形

2016-04-01 11:46 288 查看
// opengl_test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<Windows.h>
#include<GL/GL.h>
#include<GL/GLU.h>
#include<GL/glut.h>

static GLfloat spin = 0.0;

void init(void)
{
//确定窗口将清除成什么颜色
glClearColor(0.0, 0.0, 0.0, 0.0);
//设置着色模式:采用恒定着色,使用图元中某个顶点的颜色来渲染整个图元
glShadeModel(GL_FLAT);
}

void display(void)
{
//完成清除窗口的功能:清除当前可写的颜色缓冲
glClear(GL_COLOR_BUFFER_BIT);
//将当前矩阵保存入堆栈顶
glPushMatrix();
//图形沿着方向向量(0.0,0.0,1.0)选择spin度
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 + 2.0;
if (spin > 360.0)
spin = spin - 360.0;
//标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口
//的正常面板。多次调用glutPostRedisplay,在下一个显示回调只产生单一的重新显示回调
glutPostRedisplay();
}

void reshape(int w, int h)
{
//以像素为单位,指定了视口的左下角(0,0),宽度,高度
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
//设置当前矩阵模式:对投影矩阵应用随后的矩阵操作
glMatrixMode(GL_PROJECTION);
//将当前的用户坐标系的原点移到屏幕中心,类似于复位操作
glLoadIdentity();
//指定了opengl在绘制最终图像时所使用的坐标系统,决定了图像如何映射到屏幕上
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);
break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
int _tmain(int argc, char* argv[])
{
//对GLUT进行初始化,并处理所有命令行参数,应该在调用其他任何GLUT函数之前调用。
glutInit(&argc, argv);
//使用双缓存窗口和RGB颜色模式的窗口
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
//初始化窗口尺寸
glutInitWindowSize(250, 250);
//初始化窗口左上角的屏幕位置
glutInitWindowPosition(100, 100);
//创建窗口
glutCreateWindow(argv[0]);
int();
//当GUI确定一个窗口的内容需要重新显示时。通过此函数注册的回调函数就会被执行。
glutDisplayFunc(display);
//当前窗口大小改变时,此回调会执行
glutReshapeFunc(reshape);
//鼠标有动作执行时,此回调会执行
glutMouseFunc(mouse);
//进入GLUT时间处理循环,让所有的与事件有关的函数调用无限循环
glutMainLoop();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: