1.OpenGL基本框架

1.1OpenGL简介

OpenGL(Open Graphics Library,开放图形库),是三维计算机图形和模型库。作为一个性能优越的图形应用程序设计界面(API),它独立于硬件和窗口系统。并在军事、广播电视、CAD/CAM/CAE、娱乐、艺术造型、医疗影像、虚拟世界等领域都有广泛的用途。具有以下功能:

1.模型绘制

2. 模型观察

3.颜色模式的指定

4.光照应用

5.图片效果增强

6.位图和图象处理

7.纹理映射

8.实时动画

9.交互技术

1.2 OpenGL工作方式

1.2.1 OpenGL的体系结构

OpenGL是一种图形应用程序设计界面(API),不含任何窗口管理、用户交互或文件I/O函数。每个主机环境有这些函数,负责实现某些方法,把窗口或位图的绘制控制权交给OpenGL。

2.OpenGL绘制图形

2.1绘制矩形

代码如下:


#include <gl/glut.h>/*****
显示回调函数RenderScene,调用OpenGL渲染函数
用于在窗口中绘制需要的图形
**************/
void RenderScene(void)
{// 用当前的清除颜色清除窗口glClear(GL_COLOR_BUFFER_BIT);// 把绘图颜色设置为青色(RGB)glColor3f(0.0f,1.0f,1.0f);// 用当前颜色绘制一个填充的矩形,参数表示左上角点和右下角点的坐标//glRectf(100.0f, 150.0f, 150.0f, 100.0f);glRectf(-25.0f, 25.0f, 25.0f, -25.0f);// 刷新绘图命令glFlush();
}// 用于初始化,常用来设置场景渲染状态
void SetupRC(void)
{// 把清除颜色设置为紫色,即窗口的背景色glClearColor(1.0f, 0.0f,1.0f, 1.0f);
}// 当窗口改变大小时,调用登记的函数
void ChangeSize(GLsizei w, GLsizei h)
{GLfloat aspectRatio;// 防止被0除if(h == 0){h = 1;}// 设置视区尺寸,把视口设置为窗口大小glViewport(0, 0, w, h);// 重置坐标系统,使投影变换复位glMatrixMode(GL_PROJECTION);glLoadIdentity();// 建立裁剪区域的范围(左、右、底、顶、近、远)aspectRatio = (GLfloat)w / (GLfloat)h;if(w <= h){glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);}else{glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);}//定义投影矩阵,三维到二维的映射glMatrixMode(GL_MODELVIEW);//复位坐标系glLoadIdentity();
}void main()
{//初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//创建一个名为GLRect的窗口glutCreateWindow("GLRect");//设置当前窗口的显示回调函数和窗口在整形回调函数glutDisplayFunc(RenderScene);glutReshapeFunc(ChangeSize);SetupRC();//启动主GLUT事件处理循环glutMainLoop();
}

运行结果:

2.2绘制移动的矩形

代码如下:

  /*
glutTimerFunc(unsigned int msecs,(*func) (int value),int value);
该函数用于指定一个定时器回调函数,即经过msecs毫秒后由GLUT调用指定的函数,并将value值传递给它
被定时器调用的函数原型为:
void TimerFunction(int value);
但该函数只会激发一次。所以,为了实现连续的动画,必须在定时器函数中再次重新设置定时器回调函数
*/#include <windows.h>
#include <gl/glut.h>
#include<gl/gl.h>
#include<gl/glu.h>// 参数指定正方形的位置和大小
GLfloat x1 = 100.0f;
GLfloat y1 = 150.0f;
GLsizei rsize = 50;// 正方形运动变化的步长
GLfloat xstep = 1.0f;
GLfloat ystep = 1.0f;// 窗口的大小
GLfloat windowWidth;
GLfloat windowHeight;void RenderScene(void)
{glClear(GL_COLOR_BUFFER_BIT);//红色glColor3f(1.0f, 0.0f, 0.0f);//用当前颜色绘制一个填充的图形glRectf(x1, y1, x1+rsize, y1+rsize);//清空命令行缓冲区并交换帧缓存glutSwapBuffers();
}void ChangeSize(GLsizei w, GLsizei h)
{if(h == 0) h = 1;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity(); if (w <= h){windowHeight = 250.0f*h/w;windowWidth = 250.0f;}else{windowWidth = 250.0f*w/h;windowHeight = 250.0f;}glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}
void TimerFunction(int value)
{// 处理到达窗口边界的正方形,使之反弹if(x1 > windowWidth-rsize || x1 < 0) xstep = -xstep;if(y1 > windowHeight-rsize || y1 < 0) ystep = -ystep;if(x1 > windowWidth-rsize) x1 = windowWidth-rsize-1;if(y1 > windowHeight-rsize) y1 = windowHeight-rsize-1;// 根据步长修改正方形的位置x1 += xstep;y1 += ystep;// 用新坐标重新绘图glutPostRedisplay();glutTimerFunc(33,TimerFunction, 1);
}void SetupRC(void)
{//设置窗口清除色为蓝色
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}int main(void)
{glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutCreateWindow("Bounce"); glutDisplayFunc(RenderScene);glutReshapeFunc(ChangeSize);glutTimerFunc(200, TimerFunction, 1);SetupRC();glutMainLoop();
}

运行结果:


【OpenGL学习一】用OpenGL绘制图形,制作动画相关推荐

  1. 【OpenGL学习笔记①】——openGL flew flgw flut 环境配置 + 绘制出Hello World

      该文章旨在帮助 计算机图形学 openGL 初学者快速安装和配置 openGL的环境(包括glew和glfw,还有glut[进阶]),并手把手指导如何绘制出第一句 "Hello Worl ...

  2. OpenGL 学习系列--基础的绘制流程

    这里,假定绘制一个位于原点的点(0,0),那么映射之后的位置就手机屏幕的中心了. 基本图元 解决了位置的问题,接下来就是形状和颜色的问题. 如同 Android 的 Canvas 对象提供了一些方法来 ...

  3. OpenGL学习---1.1 OpenGL基本介绍

    前记:非常有乐趣,学!!!-------------------------------博主:mx 核心模式与立即渲染模式 立即渲染模式(Immediate mode,也就是固定渲染管线): 优点:这 ...

  4. OpenGL学习----基本概念-OpenGL介绍

    1. 基本概念 1.1 OpenGL介绍 1.1.1 概述 OpenGL(英语:Open Graphics Library,译名:开放图形库或者"开放式图形库")是用于渲染2D.3 ...

  5. OpenGL学习笔记之三 OpenGL开发环境之GLFW与GLAD配置

    内容来源:LearnOpenGL CN 前言 在我们画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口.然而,这些操作在每个系统上都是不一样的,Open ...

  6. C++ opengl 学习笔记-在OpenGL入门级代码里面glLoadIdentity的理解

    在入门级代码里面,当在painter(Qt里的)或者自己写一个draw函数时. 发现总是要压一个矩阵或者调用glLoadIdentity. 下面本人将会结合操作系统来讲解这个为什么!主要目的是给以后的 ...

  7. 【OpenGL学习笔记②】——OpenGL基础【渲染管线 顶点着色器 片元着色器 VAO VBO 万字总结】

  8. vb 绘制图形/蝴蝶动画

    实验一 画图形 代码 Private Sub Form_Click()Scale (0, 30)-(120, 0)Circle (15, 15), 10Circle (45, 15), 10, , , ...

  9. word是如何绘制图形的?word绘制图形的方法

    很多小伙伴还不知道如何在Word中绘制出不同的形状,今天小编给大家带来了绘制的方法,还不清楚的朋友们快来一起学习吧. word绘制图形的方法 1.打开word文档,在开始菜单下点击[插入]. 2.在插 ...

  10. pAdTy_1 构建图形和动画应用程序

    2015.11.12-11.18 个人英文阅读练习笔记.原文地址:http://developer.android.com/training/building-graphics.html. 2015. ...

最新文章

  1. 小牛生产小牛的问题解决集粹
  2. python3—廖雪峰之练习(三)
  3. 3分钟解决MySQL 1032 主从错误
  4. React兄弟组件之间通信
  5. SpringMVC的请求-获得请求参数-静态资源访问的开启
  6. 视频编码中封装格式RMVB,AVI,264
  7. 光纤收发器在使用过程中有哪些需要注意的事项?
  8. IP路由故障关于BGP的疑问解答
  9. rabbitmq配置文件_RabbitMQ学习
  10. 【转】JVM--内存区域划分
  11. Myeclipse笔记
  12. 高频交易的思路模型简介
  13. CAN总线和RS485的比较:
  14. 吴昂雄回应Arm中国控制权争夺:Arm罢免我无效
  15. html 显示ai 矢量图,PS图层文件转变为AI矢量图
  16. 电脑使用 Dolby Audio提示将耳机或扬声器插入系统的音频插孔,以启用Dolby Audio
  17. 百度、谷歌搜索引擎原理
  18. Kuangbin 带你飞-线段树专题 题解
  19. JAVA百分比排序方法实现
  20. 社会工程学工具 SET 伪造网站

热门文章

  1. 格密码学习笔记(一)
  2. python你真的懂断言嘛?
  3. 编写一个Java程序在屏幕上输出1!+2!+3!+……+10!的和
  4. 惠普星15和联想小新pro16 哪个好
  5. Word高效指南 - 如何超快速作出地摊价目表
  6. Command CompileAssetCatalog failed with a nonzero exit code
  7. 基于emq x开源版实现服务重启后主题和消息恢复的完整方案
  8. Django QuerySet API 文档阅读(3):QuerySet定义(一)
  9. 解决宝塔 Nginx 跨域问题Access-Control-Allow-Origin
  10. [C#复习向整合]object与装箱拆箱