LOpengGL.h://和前一节一样。
LUtil.h://添加
const int COLOR_MODE_CYAN = 0;//定义两个颜色选择
const int COLOR_MODE_MULTI = 1;
void handleKeys( unsigned char key, int x, int y );//按键处理函数。根据按键去切换颜色
LUtil.cpp://添加
int gColorMode = COLOR_MODE_CYAN;
GLfloat gProjectionScale = 1.f;//投影缩放比例
bool initGL()//添加glOrtho
{
glMatrixMode(GL_PROJECTION);//设置为投影矩阵
glLoadIdentity();//加载单位矩阵,和前一句一起,意思是设置投影矩阵为单位矩阵。
//glOrtho将当前矩阵(也就是投影矩阵)和二维正交矩阵相乘,用于控制缩放大小的。如果是三维调用gluPerspective() 或者 glFrustum()方法
glOrtho( 0.0, SCREEN_WIDTH * gProjectionScale, SCREEN_HEIGHT * gProjectionScale, 0.0, 1.0, -1.0 );//参数分别对应左,右,下,上,近,远
......
//这里说明一下投影矩阵,模型矩阵分别干什么的:
//投影矩阵是用于控制几何视图的,简单来说,也就是外观、大小、形状。比如调用glOrtho()方法进行缩放
//模型矩阵是用于控制几何位置的,比如移动、旋转、翻转、倾斜等等。比如调用glTranslatef()方法移动位置
//那么OpenGL是怎么使用矩阵将多边形转为像素,然后进行渲染的呢?
//首先,模型矩阵负责进行各种移动、旋转、翻转、倾斜等操作,然后投影矩阵负责读取各个顶点、运算,将顶点转换为OpenGL使用的对应的视图坐标,然后连接,然后填充颜色也就是光栅化。
//总的来说就是使用ProjectionMatrix * ModelviewMatrix * Vertex 这三样东西完成将对应的顶点取出并光栅化为像素的。
}
void update()//不变
{
}
void render()
{
glClear(GL_COLOR_BUFFER_BIT);//清屏幕
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();//这两句重置模型矩阵为单位矩阵
glTranslatef(SCREEN_WIDTH / 2.f, SCREEN_HEIGHT / 2.f, 0.f);//然后移动到屏幕中心位置
if (gColorMode == COLOR_MODE_CYAN)
{
glBegin(GL_QUADS);//使用同一种颜色
glColor3f(0.f, 1.f, 1.f);
glVertex2f(-50.f, -50.f);
glVertex2f(50.f, -50.f);
glVertex2f(50.f, 50.f);
glVertex2f(-50.f, 50.f);
glEnd();
}
else
{
glBegin(GL_QUADS);
glColor3f(1.f, 0.f, 0.f); glVertex2f(-50.f, -50.f);//每一点使用一种颜色
glColor3f(1.f, 1.f, 0.f); glVertex2f(50.f, -50.f);
glColor3f(0.f, 1.f, 0.f); glVertex2f(50.f, 50.f);
glColor3f(0.f, 0.f, 1.f); glVertex2f(-50.f, 50.f);
glEnd();
}
glutSwapBuffers();//更新屏幕
}
void handleKeys(unsigned char key, int x, int y)
{
if (key == 'q')//按下键盘q键切换颜色
{
if (gColorMode == COLOR_MODE_CYAN)
{
gColorMode = COLOR_MODE_MULTI;
}
else
{
gColorMode = COLOR_MODE_CYAN;
}
}
else if (key == 'e')//按下e键进行缩放,改变大小
{
if (gProjectionScale == 1.f)
{
gProjectionScale = 2.f;
}
else if (gProjectionScale == 2.f)
{
gProjectionScale = 0.5f;
}
else if (gProjectionScale == 0.5f)
{
gProjectionScale = 1.f;
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();//和上一句一起,重置投影矩阵为单位矩阵
glOrtho(0.0, SCREEN_WIDTH * gProjectionScale, SCREEN_HEIGHT * gProjectionScale, 0.0, 1.0, -1.0);//然后进行缩放操作
}
}
main.cpp:
void runMainLoop(int val){//不变
}
int main( int argc, char* args[] )
{
...
glutKeyboardFunc( handleKeys );//添加键盘处理回调方法
glutDisplayFunc( render );
...
}