《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;
}



发现,显示列表只是保存了一个状态,在需要的时候显示这个状态。状态的属性是不能被改变的,比如颜色,坐标等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值