艺术的追求从编程开始

C/C++/UNIX/PYTHON/ALGORITHM

导航

第一课 opengl简介

1. 什么是opengl:

  opengl是图形硬件的一种软件接口。

2. opengl对场景中的图像进行渲染时所执行的主要图形操作

  1)根据几何图元创建形状,从而建立物体的数学描述。

  2)在三维空间中排列物体,并选择观察复合场景的有利视角。

  3)计算所有物体的颜色。(ps:可以使用着色器或者opengl与编程算法执行, opengl预编程算法又被称为固定功能的管线

  4)把物体的数学描述以及与物体相关的颜色信息转换为屏幕上的像素。这个过程称为光栅化rasterization.

3. 几个术语:

  rendering渲染: 计算机根据模型创建图像的过程。

  model模型:根据几个图元创建的,也被称为物体object。

  几何图元:包括点、直线、多边形,他们通顶点vertex指定。

  bitplane位平面:一块内存区域,保存了屏幕上每个像素的1个位的信息。

  framebuffer:由bitplane组织成的,保存图形硬件为控制屏幕上所有像素的颜色和强度所需要的全部信息。

4. opengl的语法:

  由gl开头,常量大写GL, 最后跟v的表示函数所接受的参数是一个指向值向量的指针。

5. OPENGL是一个状态机:

  许多模式的状态变量用 glEnable()和glDisable()函数进行启动和禁用。

  每个状态变量都有默认值,查询办法:glGetBooleanv(),glGetDoublev(), glGetIntegerv(), geGetfloatv(), glGetPointerv(), glIsEnable();

6. openGL渲染管线:

   像素数据 -----》显示列表 《--------顶点数据

    ||       ||         ||

  像素操作《-------------------------》求值器

    ||                 ||

    ||---------》光栅化《------基于顶点的操作与基本装配

    ||     ^  ||  

   纹理装配==  |  片段操作

            ||

            帧缓冲区

 

  1)显示列表 display list :任何数据无论是几何图元或者像素,都可以保存在现实列表中供以后使用。

  2)求值器: 所有几何图元通过vertex来描述, 参数化曲线和face,最终通过控制点和基函数basic function多项式来描述。求值器提供通过控制点计算表面定点的方法。

  3)基于vertex的操作:就是把顶点变换成图元,通过4×4浮点矩阵进行变换。如果使用纹理,还要进行纹理坐标变换。 如果有光照,要进行光照计算,产生最终颜色值。

  4)图元装配:主要内容是裁剪。还有透视除法、视口和深度操作。

  5)像素操作:首先解包为适当数据,接着被缩放偏移处理,然后写入纹理内存或者发送到光栅化阶段。

  6)纹理装配:在几何物体上应用纹理图像。

  7)光栅化:就是把几何数据和像素数据转换为fragment的过程。每个fragment方块对应于帧缓存区中的一个像素

  8)片段操作:在数据实际存储到帧缓冲区之前,要执行的一系列操作。

    a. 纹理处理, 在纹理内存中为每个fragment生成一个texel纹理单元。接下来组合主颜色和辅助颜色,可能还用到一次雾计算。

    b. 生成最终颜色和深度以后,进行裁剪测试,alpha测试,模板测试,深度缓冲区测试;

    c. 混合,抖动, 逻辑操作,以及根据一个位掩码的屏蔽操作。

    d. 绘制到适当的缓冲区,最终成为一个pixel。

7. opengl相关函数库:

  工具函数库GLU,窗口系统扩展glX\wgl\agl,cgl,实用工具库GLUT

  包含文件#include <GL/gl.h>

      #include <GL/glu.h>

  在包含了glut.h或者freeglut.h以后就不用包含上面两者了。

8. glut:

  1)窗口管理:  

    void glutInit(int argc, char**argv);

    void gultInitDisplayMode(unsigned int mode);

    void glutInitContextVersion(int maj, int min);

    void glutInitWindowSize(int width, int height);

    void glutInitWindowPostion(int x, int y);

      void glutCreateWindow(char * name);

  2)处理窗口和事件

    void glutDisplayFunc(void (*func)(void));

    void glutReshapeFunc(void (*func)(int width, int height));

    void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));

    void glutMouseFunc(void (*func)(int button,int state, int x, int y));

    void glutMotionFunc(void (*func)(int x, int y));

    void glutPostRedisplay(void);

  3)加载颜色表:void glutSetColor(...);

  4)初始化和绘制三维物体:略

  5)管理背景过程:void glutIdleFunc();

  6)运行程序: void glutMainLoop();

9. 一个双缓冲的动画程序:

#include <glut.h>
#include <Windows.h>
#include <stdio.h>

static GLfloat spin = 0.0;

void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    glRotatef(spin, 0.0, 0.0, 1.0);
    glColor3f(1.0, 1.0, 1.0);
    glRectf(-25.0, -25.0, 25.0, 25.0);
    glPopMatrix();
    glutSwapBuffers();
}

void spinDisplay(void)
{
    spin = spin + 2.0;
    if(spin > 360.0){
        spin = spin - 360.0;
    }
    glutPostRedisplay();
}

void reshape(int w, int h)
{
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void mouse(int button, int state, int x, int y){
    switch(button){
    case GLUT_LEFT_BUTTON:
        if(state == GLUT_DOWN){
            glutIdleFunc(spinDisplay);
        }
        break;
    case GLUT_MIDDLE_BUTTON:
        if(state == GLUT_DOWN)
            glutIdleFunc(NULL);
        break;
    default:
        break;
    }
}

int main(int argc, char ** argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(250, 250);
    glutInitWindowPosition(100, 100);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMouseFunc(mouse);
    glutMainLoop();
    return 0;
}

 

 

posted on 2013-11-17 21:33  Rambo.Wang  阅读(860)  评论(0编辑  收藏  举报