#include <gl/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
void display(void)
{
//清除掉所有像素
glClear(GL_COLOR_BUFFER_BIT);
//画一个白色多边形
glColor3f(1.0, 1.0, 1.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();*/
glutWireTeapot(0.5);
//不等 OpenGL 其他地方调用,直接显示
glFlush();
}
void displayMotion(int x, int y)
{
//这里的x,y都是相对于绘制的窗口而言的,窗口的左上角为(0,0),右下角为(250,250)
cout<<x<<""<<y<<endl;
}
void displayMouse(int button, int state, int x, int y)
{
/*
* 这里的x,y都是相对于绘制的窗口而言的,窗口的左上角为(0,0),右下角为(250,250)
* button==0 左键 button==2 右键 state==0 按下 state==1 抬起
*/
cout<<"button="<<button<<" state="<<state<<" x="<<x<<" y="<<y<<endl;
}
void displayKeyboard(unsigned char key, int x, int y)
{
/*
* 这里的x,y都是相对于绘制的窗口而言的,窗口的左上角为(0,0),右下角为(250,250),是鼠标所在的位置
* key 是按下去的键
*/
cout<<"key="<<key<<" x="<<x<<" y="<<y<<endl;
}
void init(void)
{
//设置清除背景的颜色
glClearColor(0.0, 0.0, 0.0, 0.0);
//初始化
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);//设置坐标系 左、右、下、上、近、远
glOrtho(0.5, 0.5, 0.5, 0.5, -1.0, 1.0);
//这个程序画出来的图形,比例会随着窗口大小的变化而自动调整
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//初始化显示模式:单缓冲区,RGB模式
glutInitWindowSize(250, 250);
glutInitWindowPosition(100, 100);
glutCreateWindow("Hello,OpenGL");
init();
/*
* 显示回调函数,当GLUT确定一个窗口的内容重新显示时,通过这个函数注册的回调函数就会执行
* 所以应该把重绘场景所需要的所有代码都放在这个显示回调函数里
*/
glutDisplayFunc(display);
/*
* 当按下鼠标并移动鼠标时调用注册函数 glutMotionFunc(void(*func)(int x, int y))
*/
glutMotionFunc(displayMotion);
/*
* 当按下鼠标时调用注册函数
*/
glutMouseFunc(displayMouse);
/*
* 当按下键盘上的某个键时
*/
glutKeyboardFunc(displayKeyboard);
/*
* 如果程序修改了窗口的内容,有时候可能需要调用 glutPostRedisplay(),则它将会指示下面这个
* 函数调用已注册的显示回调函数。
* 必须调用这个函数来启动程序。已注册的显示回调函数,一旦进入循环永远不会退出
*/
glutMainLoop();
return 0;
}