OpenGL新手框架

开始学习用OpenGL,也就想显示一些点,以为挺简单的,哎,看了两天才会画三维的点,做个总结。

使用OpenGL的基本流程

int main(int argv, char *argc[])

{

    //初始化glut

    glutInit(&argv, argc);

    //初始化显示模式

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

    //设置窗口大小

    glutInitWindowSize(800, 600);

    //创建窗口

    glutCreateWindow("Point Demo");



    //注册回调函数

    glutReshapeFunc(onChangeSize);

    glutDisplayFunc(onRender);

    glutSpecialFunc(onSpecialKeyFunc);



    setupRenderingContext();



    glutMainLoop();



    return 0;

}

主要是glut库进行了一些初始化操作,并注册需要的回调函数(事件处理函数)。

glutReshapeFunc  窗口大小发生改变的时候调用注册函数

glutDisplayFunc   显示的时候调用的函数,各种的画图操作都在这里进行

glutSpecialFunc   特殊按键(上、下、左、右)按下时调用的函数

还有其他的一些回调函数,例如:窗口关闭时,这里不再一一赘述。

setupRenderingContext 设置渲染的上下文(渲染环境)

glutMainLoop  进入主消息循环

函数名称的一个简单说明glut开头的是glut库的一些函数,gl开头的则是标准的OpenGL库的函数。由于OpenGL没有提供诸如窗口管理、输入输出以及按键等的处理函数,所以需要一些OpenGL的扩展库

来处理这些操作,并且OpenGL官方也提倡开发一些扩展库。glut是OpenGL中比较常见的一种。

回调函数及渲染环境设置

窗口大小改变时的回调函数

//窗口大小改变的回调函数

void onChangeSize(GLint w,GLint h){

    //横宽比

    GLfloat ratio;



    //设置坐标系x(-100.0f,100.0f),y(-100.0f,100.0f),z(-100.0f,100.0f)

    GLfloat coordinateSize = 100.0f;



    //设置视口和窗口大小一样

    glViewport(0, 0, w, h);



    //对投影矩阵应用随后的矩阵操作

    glMatrixMode(GL_PROJECTION);



    //重置当前指定的矩阵为单位矩阵

    glLoadIdentity();

    ratio = (GLfloat)w / (GLfloat)h;



    //正交投影

    if (w < h)

        glOrtho(-coordinateSize, coordinateSize, -coordinateSize / ratio, coordinateSize / ratio, -coordinateSize, coordinateSize);

    else

        glOrtho(-coordinateSize * ratio, coordinateSize * ratio, -coordinateSize, coordinateSize, -coordinateSize, coordinateSize);



    //对模型视图矩阵堆栈应用随后的矩阵操作

    glMatrixMode(GL_MODELVIEW);

    //重置当前指定矩阵为单位矩阵

    glLoadIdentity();

}

设置所使用的坐标系以及视口(viewport),坐标系、视口以及一些矩阵变换另作总结,这里不详述。

Display时的回调函数

//渲染

void onRender(){

    //清理

    glClear(GL_COLOR_BUFFER_BIT);



    //将当前matrix状态入栈

    glPushMatrix();

    

    glRotatef(xRotAngle, 1.0f, 0.0f, 0.0f);

    glRotatef(yRotAngle, 0.0f, 1.0f, 0.0f);



    glBegin(GL_POINTS);

    srand((unsigned)time(NULL));

    GLfloat x, y, z;

    for (int i = 0; i < 1000; i ++){

        x = rand() % 201 - 100;

        y = rand() % 201 - 100;

        z = rand() % 201 - 100;



        glVertex3f(x, y, z);

    }

    glEnd();

    //恢复栈的Matrix

    glPopMatrix();



    //交换两个缓冲区

    glutSwapBuffers();

}

生成1000个随机的三维点,作图的操作主要这里进行。

设置渲染环境

//设置Rendering context

void setupRenderingContext() {

    //设置clear color为黑色

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);



    //设置绘图颜色

    glColor3f(1.0f, 1.0f, 0.0f);

}

设置了背景色以及绘图的前景色

特殊按键回调函数

void onSpecialKeyFunc(GLint key, GLint x, GLint y){

    if (key == GLUT_KEY_UP){

        xRotAngle -= 5.0f;

    }

    else if (key == GLUT_KEY_DOWN){

        xRotAngle += 5.0f;

    }

    else if (key == GLUT_KEY_LEFT){

        yRotAngle -= 5.0f;

    }

    else if (key == GLUT_KEY_RIGHT){

        yRotAngle += 5.0f;

    }

    //重新绘制

    glutPostRedisplay();

}

按下上、下、左、右键时进行旋转

结果

image

 

总结

简单的OpenGL使用框架

//设置Rendering context

void setupRenderingContext() {

    //设置clear color为黑色

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);



    //设置绘图颜色

    glColor3f(1.0f, 1.0f, 0.0f);

}



//窗口大小改变的回调函数

void onChangeSize(GLint w,GLint h){

    //横宽比

    GLfloat ratio;



    //设置坐标系x(-100.0f,100.0f),y(-100.0f,100.0f),z(-100.0f,100.0f)

    GLfloat coordinateSize = 100.0f;



    //设置视口和窗口大小一样

    glViewport(0, 0, w, h);



    //对投影矩阵应用随后的矩阵操作

    glMatrixMode(GL_PROJECTION);



    //重置当前指定的矩阵为单位矩阵

    glLoadIdentity();

    ratio = (GLfloat)w / (GLfloat)h;



    //正交投影

    if (w < h)

        glOrtho(-coordinateSize, coordinateSize, -coordinateSize / ratio, coordinateSize / ratio, -coordinateSize, coordinateSize);

    else

        glOrtho(-coordinateSize * ratio, coordinateSize * ratio, -coordinateSize, coordinateSize, -coordinateSize, coordinateSize);



    //对模型视图矩阵堆栈应用随后的矩阵操作

    glMatrixMode(GL_MODELVIEW);

    //重置当前指定矩阵为单位矩阵

    glLoadIdentity();

}



//渲染

void onRender(){

    //清理

    glClear(GL_COLOR_BUFFER_BIT);



    //TODO:主要操作在这里



    //交换两个缓冲区

    glutSwapBuffers();

}



int main(int argv, char *argc[])

{

    //初始化glut

    glutInit(&argv, argc);

    //初始化显示模式

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

    //设置窗口大小

    glutInitWindowSize(800, 600);

    //创建窗口

    glutCreateWindow("Point Demo");



    //注册回调函数

    glutReshapeFunc(onChangeSize);

    glutDisplayFunc(onRender);



    setupRenderingContext();



    glutMainLoop();



    return 0;

}

 

你可能感兴趣的:(OpenGL)