开始学习用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;
}

 

OpenGL新手框架的更多相关文章

  1. S2SH新手框架建立具体过程

    S2SH集成框架新手学习总结 第一章:S2SH框架新手搭建准备工作仅仅都须要导入那些文件 第二篇:S2SH框架新手搭建具体过程 版本号信息:Struts2.3+Hibernate4.3.6+Sprin ...

  2. WhyGL:一套学习OpenGL的框架,及翻写Nehe的OpenGL教程

    最近在重学OpenGL,之所以说重学是因为上次接触OpenGL还是在学校里,工作之后就一直在搞D3D,一转眼已经毕业6年了.OpenGL这门手艺早就完全荒废了,现在只能是重学.学习程序最有效的办法是动 ...

  3. OpenGL基本框架与三维对象绘制

    上次我们介绍了OpenGL的环境构建和二维对象的绘制,这次我们来讲讲三维对象的绘制: 绘制代码如下: Github代码仓库 // opengltest2.cpp : Defines the entry ...

  4. OpenGL绘图框架(GLFW)

    下载地址:http://www.glfw.org/download.html

  5. OpenGL教程之新手上路

    Jeff Molofee(NeHe)的OpenGL教程- 新手上路 译者的话:NeHe的教程一共同拥有30多课,内容翔实,而且不断更新 .国内的站点实在应该向他们学习.令人吃惊的是,NeHe提供的例程 ...

  6. OpenGL编程-OpenGL框架-win32项目

    在win32项目中开发的程序 小知识: 控制台应用程序运行就是dos的界面 项目一般采用了可视化开发 开发出来的东西就像QQ之类的 是有窗口界面的 程序运行结果是这样的 源代码:对第45行进行覆盖 # ...

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

    项目中要画3D显示的模型,于是要用到OpenGL,加上是在MFC中,并且是在MFC中的ActiveX中使用.再并且鉴于他们程序主框架的设定.常规的方法还不一定能实现.所以还是查过不少资料,在此一一总结 ...

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

    >_<: 首先推荐一个企业版的VC6.0自带OpenGL和DirectX,非常方便:http://pan.baidu.com/s/1mgIAGi8 PS: 要注意这里的OpenGL建立的工 ...

  9. NeHe OpenGL教程 第一课:OpenGL窗口

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. 太极旋转-JS实现

    刚学了js的一些函数,所以做了一个太极的旋转.做完之后是上面这个样子的,是可以旋转的. 思路: 1.先做一个基准转盘,之后将元素都放在转盘上,跟随转盘动. 2.画两个半圆,主要属性是border-to ...

  2. 一些linux包相关命令

    针对centos 查看CentOS版本方法: lsb_release -a #result------------ LSB Version: :base-4.0-amd64:base-4.0-noar ...

  3. Sql Server 2012新特性 Online添加非空栏位.

    我们都知道,Sql Server在一个数据量巨大的表中添加一个非空栏位是比较费心的,缺乏经验的DBA或是开发人员甚至可能鲁莽地直接添加导致阻塞相应业务,甚至可能因为资源欠缺造成实例的全局问题.当然这都 ...

  4. CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)

    事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0 ...

  5. 2013年度IT博客大赛跻身10强

    2013年12月26日,由51CTO独家举办的2013年度IT博客大赛圆满落幕,荣幸跻身10强[http://fellow.51cto.com/art/201312/425528.htm],首先感谢各 ...

  6. (源码下载)高灵活度,高适用性,高性能,轻量级的 ORM 实现

    我在上一篇博客中简单说明了一个面向内存数据集的“ORM”的实现方法,也提到我的设计实现或许不能称之为“ORM”,姑且称之为 S-ORM吧. 可能有些小伙伴没有理解我的思路和目的,与传统ORM框架做了简 ...

  7. 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...

  8. dofile执行ANDROID APK里面的文件

    我使用dofile执行APK文件是不行的,比如 dofile("assets/res/flist")只能先拷贝到writablePath然后再dofile拿到数据后再清除这个临时文 ...

  9. Atitit xml命名空间机制

    Atitit xml命名空间机制 命名冲突1 使用前缀来避免命名冲突2 使用命名空间(Namespaces)2 XML Namespace (xmlns) 属性2 默认的命名空间(Default Na ...

  10. fir.im Weekly - TouchBar 从入门到开发

    自从 Macbook Pro 发布重大更新, TouchBar 一直是开发者的重点关注对象.除了NSTouchBar官方文档,速度快者如 @毫无存在感的Cee,分享了一篇 NSTouchBar 的入门 ...