《OpenGL編程基礎》第三章習題

又將近一個月,我真混蛋啊,,,

好吧,今次還是第三章,雖然已經看到第五章了,但是一直沒有做習題。

公司準備用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;
}



發現,顯示列表只是保存了一個狀態,在需要的時候顯示這個狀態。狀態的屬性是不能被改變的,比如顏色,座標等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章