在看了许多实例之后,
准备沿着OpenGL编程指南(第七版)学习OpenGL.
运行环境:
(1)Windows 7
(2)CodeBlocks
(3)GLUT
(4)Author:Lane
2014-12-02
1.黑色背景加白色矩形
核心函数:glOrtho.(通过注释和修改参数测试,参考http://blog.csdn.net/shizhipeng/article/details/4939529)
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <cstdlib>
#include <cstdio>
#include <cmath>
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();
glFlush();//刷新,将缓冲区数据输出
}
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);
}
int main(int argc,char** argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);//窗口位置
glutInitWindowSize(250,250);//窗口大小
glutCreateWindow("hello");//窗口命名
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
2.单击触发旋转事件,鼠标轮轴点击停止的白色矩形
测试glShadeModel(GL_FLAT和GL_SMOOTH)
核心函数glutIdleFunc和glutPostRedisplay.
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <cstdlib>
#include <cstdio>
#include <cmath>
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();
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();//交换缓冲
}
//CPU闲暇时间执行此函数
void spinDisplay(void){
spin = spin + 2.0;
if(spin > 360.0)
spin -= 360.0;
glutPostRedisplay();//标记当前窗口重新绘制
}
void reshape(int w,int h){
glViewport(0,0,(GLsizei) w,(GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();//恢复初始坐标
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)
glutId