opengl (1) 基本API的熟悉

代码从此处下载 

1 运行如下代码,可以看到如下效果,我们利用opengl画出一个三角形。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void renderScene(void)
{
    /*
    glClear清除缓冲区
    */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /*
    将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
    1.X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
    2.OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
    3.中心左面的坐标值是负值,右面是正值。
    移向屏幕顶端是正值,移向屏幕底端是负值。
    移入屏幕深处是负值,移出屏幕则是正值。
    */
    glLoadIdentity();

    /*
    画出三个顶点,根据这三个顶点链接成一个凸包
    */

    glBegin(GL_TRIANGLES);//GL_TRIANGLES三角形
    glVertex3f(-1.0, -1.0, 0.0);
    glVertex3f(1.0, 0.0, 0.0);
    glVertex3f(0.0, 1.0, 0.0);
    glEnd();

    /*
    双缓冲模式
    与 glutInitDisplayMode(GLUT_RGBA) 对应
    */
    glutSwapBuffers();
}

这个代码中需要解释的是glLoadIdentity(),假如这个函数去掉,当我们窗口大小变化的时候,窗口中的所有东西都会消失。

这个小小的细节涉及到opengl的渲染机制,opengl有个变化矩阵堆栈,opengl中的每个定义好的将要渲染的矩阵呈现之前都要先乘以栈顶的矩阵。glLoadIdentity()将栈顶的矩阵设置为固定不变的单位矩阵,所以当窗口大小变化需要重绘窗口的时候,就可以就可以保持不变了。

其他情况类似的情况如下:

glTranslatef:将T(x,y,z)右乘与堆栈的栈顶变换矩阵。右乘的解释,假设目前栈顶变换矩阵为M,那么就相当于把M修改为M*T.
glRotatef :将R(x,y,z,s)右乘与堆栈的栈顶变换矩阵。
glLoadIdentity:将堆栈的栈顶变换矩阵设置成单位矩阵。
glPushMatrix:将堆栈的栈顶变换矩阵复制一份,然后Push到堆栈中。所谓Push,就像塞子弹一样把一个矩阵压入到堆栈中,此时,栈顶就是这个新的矩阵了,注意定义的向量都是和栈顶变换矩阵作用的。

glPopMatrix:将堆栈的栈顶变换矩阵Pop出来。

更多细节参考  http://wenku.baidu.com/view/a4f5748fcc22bcd126ff0c1a.html

 

2 关于视图显示 glViewport();glOrtho();

void renderScene_1(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    /* 
    画笔的颜色
    */
    glColor3f(1.0, 1.0, 0.0);
    
    glLoadIdentity();
    
    /* 
    http://hi.baidu.com/xun1573/item/a872977f9fbbbd366cc37c6f 
    http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html 
    glOrtho获取截屏
    procedure glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);
    拉伸之后放在glViewPort上,
    根据glViewPort(x, y, width, height)
    放在总的窗口上的(x, y)坐标上
    */

    glViewport(50, 50, 300, 300);
    glOrtho(0.25, 0.25, 0.75, 0.75, -0.0, 0.5);

    /* 
    画一个正方形
    */

    glBegin(GL_POLYGON);
    {
        glVertex3f(0.25, 0.25, 0.0);
        glVertex3f(0.75, 0.25, 0.0);
        glVertex3f(0.75, 0.75, 0.0);
        glVertex3f(0.25, 0.75, 0.0);
    }
    glEnd();

    /* 
    双缓冲渲染
    */

    glutSwapBuffers();
}

 

http://hi.baidu.com/xun1573/item/a872977f9fbbbd366cc37c6f

http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html

posted on 2013-09-13 20:59  zhxfl  阅读(418)  评论(0编辑  收藏  举报

导航