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();
}

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

结果

 

总结

简单的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;
}

 

时间: 2024-10-11 12:35:56

OpenGL新手框架的相关文章

OpenGL教程之新手上路

Jeff Molofee(NeHe)的OpenGL教程- 新手上路 译者的话:NeHe的教程一共同拥有30多课,内容翔实,而且不断更新 .国内的站点实在应该向他们学习.令人吃惊的是,NeHe提供的例程源代码差点儿都有跨平台的不同编译版本号,涉及从Visual C++.Borland C++.Visual Basic.MacOS X/GLUT.Linux/GLX.Code Warrior.Delphi.C++ Builder.MASM.ASM.MingW32&Allegro以及Python等等的不

OpenGL编程-OpenGL框架-win32项目

在win32项目中开发的程序 小知识: 控制台应用程序运行就是dos的界面 项目一般采用了可视化开发 开发出来的东西就像QQ之类的 是有窗口界面的 程序运行结果是这样的 源代码:对第45行进行覆盖 1 #include <windows.h> //Windows的头文件 2 #include <gl\gl.h> //包含OpenGL基本库 3 #include <gl\glu.h> //包含OpenGL实用库 4 #include <gl\glaux.h>

OpenGL在MFC中的使用总结(一)——基本框架

项目中要画3D显示的模型,于是要用到OpenGL,加上是在MFC中,并且是在MFC中的ActiveX中使用.再并且鉴于他们程序主框架的设定.常规的方法还不一定能实现.所以还是查过不少资料,在此一一总结一下.首先总结最基础的一些东西. 一.依照讲课的逻辑,先讲点原理性的东西~ GDI是通过设备描写叙述表(Device Context,下面简称"DC")来画图.而OpenGL是通过渲染描写叙述表(Rendering Context,下面简称"RC").每个GDI命令须要

[OpenGL] 1、环境搭建及最小系统

>_<: 首先推荐一个企业版的VC6.0自带OpenGL和DirectX,非常方便:http://pan.baidu.com/s/1mgIAGi8 PS: 要注意这里的OpenGL建立的工程有一点小错误,即:#include <glu.h> #include <gl.h>要在前面加上GL\(因为这两个文件是在include/GL文件夹内的) 此外,还要推荐一个非常好的OpenGL学习网站:http://www.yakergong.net/nehe/ PS: 由于这个网站

OpenGL学习系列第二篇

在这个教程里,我们一起来玩第一个OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架. 在CodeBlock里创建一个新的GLUT Win32程序(不是console控制台程序)后,我们还需要链接OpenGL库文件. 代码的前4行包括了我们使用的每个库文件的头文件.如下所示: #include <windows.h>// Windows的头文件 #include <glew.h>       // 包含最新的gl.

iOS的基本框架

在iOS中框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像.声音文件等其他资源.共享资源库定义应用程序可以调用的函数和方法.    iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer(触摸UI层).MediaLayer(媒体层).Core Services Layer(核心服务层).Core OS Layer(核心OS层). 低层次框架提供IOS的基本服务和技术,高层次框架建立在

ios开发——实用技术篇OC篇&amp;iOS的主要框架

iOS的主要框架         阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core Graphics框架帮助你创建图形 Core Animation允许你创建高级的动画和虚拟效果 OpenGL ES 框架提供2D和3D绘图工具 将别的框架添加到工程里 本文是<Sunvey the Major Framworks>一文的翻译 框架是一个目录,这个目录包含了共享库,访问共享库里代码

(转)iOS的主要框架介绍

框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件.一个共享库定义的方法或函数可以被应用程序调用. IOS提供了很多你可以在应用程序里调用的框架.要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它.许多应用程序都使用了如Foundation.UIKit.和Core Graphics这些框架.根据你为应用程序选择的模版,相关的框架就已经被自动引入了.如果默认加入的框架不能满足你的应用程序的需求,你也可以加入需要的框架. 看看HelloWorld

小菜学Chromium之OpenGL学习之二

在这个教程里,我们一起来玩第一个OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架. 在CodeBlock里创建一个新的GLUT Win32程序(不是console控制台程序)后,我们还需要链接OpenGL库文件. 代码的前4行包括了我们使用的每个库文件的头文件.如下所示: #include <windows.h> // Windows的头文件 #include <glew.h>       // 包含最新的gl