又將近一個月,我真混蛋啊,,,
好吧,今次還是第三章,雖然已經看到第五章了,但是一直沒有做習題。
公司準備用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;
}
發現,顯示列表只是保存了一個狀態,在需要的時候顯示這個狀態。狀態的屬性是不能被改變的,比如顏色,座標等等。