又将近一个月,我真混蛋啊,,,
好吧,今次还是第三章,虽然已经看到第五章了,但是一直没有做习题。
公司准备用ogre。苦逼的我感觉还是要有点儿底子,不然哪儿看得懂代码么。
为了知其然知其所以然。继续。路漫漫其修远兮,吾将好好学习,,,语文不太好,反正就是要表达这么个意思。
看了看第三章的习题。主要是一些glut的应用,glut库其实是一个主要针对输入输出的库,在不同的设备中,这个库其实可以被其他库取代的。ogre中使用ois替代了。所以我不太想做这个库太多的习题,因为不是重点。不过习题中有对显示列表的应用 ,倒是应该练习一下,了解下其工作机制。
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#define RED_TRIANGLE 1
#define GREEN_CIRCLE 2
static float x1=-1.0, x2=2.0, y1=1.0, y2=-1.0;
static void initPlayList()
{
//定义显示列表 RED_TRIANGLE
glNewList(RED_TRIANGLE, GL_COMPILE); //创建一个显示列表
glPushAttrib(GL_CURRENT_BIT); //先保存当前矩阵状态
glColor3f(1.0, 0.0, 0.0); //设置颜色
glBegin(GL_TRIANGLES); //与往常多边形的的定义方法一样
glVertex2f(-1.0, 1.0);
glVertex2f(-2.0, 0.0);
glVertex2f(0.0, 0.0);
glEnd();
glPopAttrib(); //恢复矩阵状态 (事实是,我一直没明白这么做的意义,为什么保存,我的哪些操作可能会破坏原有矩阵的状态,等等,,)
glEndList();
//定义显示列表 GREEN_CIRCLE
glNewList(GREEN_CIRCLE, GL_COMPILE);
glPushAttrib(GL_CURRENT_BIT);
glColor3f(0.0, 1.0, 0.0);
glBegin(GL_QUADS);
glVertex2f(0.0, 1.0);
glVertex2f(0.0, -1.0);
glVertex2f(2.0, -1.0);
glVertex2f(2.0, 1.0);
glEnd();
glPopAttrib();
glEndList();
}
static void reshape(int width, int height)
{
glViewport(0, 0, width, height); //设置视口,位置在窗口坐标(0, 0),高宽如参数。
glMatrixMode(GL_PROJECTION); //开始修改GL_PROJECTION矩阵
glLoadIdentity(); //单位化矩阵
gluOrtho2D(-2.0, 2.0, -2.0, 2.0); //设置正交视域体,是以(-2,-2)(2,2)构成的线段为对角线的矩形区域
glMatrixMode(GL_MODELVIEW); //开始修改GL_MODEVIEW矩阵
glLoadIdentity(); //单位化矩阵
}
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushMatrix();
glCallList(RED_TRIANGLE); //调用显示列表RED_TRIANGLE
glCallList(GREEN_CIRCLE); //调用显示列表GREEN_CIRCLE
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv); //将main接收倒的参数传递给glut
glutInitWindowSize(640, 480); //初始化窗口大小
glutInitDisplayMode(GLUT_RGB //启用RGB颜色
|GLUT_DOUBLE //双缓存
|GLUT_DEPTH); //深度缓存
glutCreateWindow("practice_3"); //创建窗口,标题为“practice_3”
glClearColor(1.0, 1.0, 1.0, 1.0); //白色背景
initPlayList();
glutReshapeFunc(reshape); //注册窗口改变时的回调
glutDisplayFunc(display); //注册显示回调
glutMainLoop();
return EXIT_SUCCESS;
}
发现,显示列表只是保存了一个状态,在需要的时候显示这个状态。状态的属性是不能被改变的,比如颜色,坐标等等。