1.什么是OpenGL?

OpenGL对场景中的图像进行渲染时所执行的主要图形操作:

  1. 根据几何图元创建形状,从而建立物体的数字描述。(OpenGL把点、直线、多边形和位图作为基本的图元)。
  2. 在三维空间中排列物体,并选择观察复合场景的有利视角。
  3. 计算所有物体的颜色。颜色可以有应用程序明确指定,可以根据特定的光照条件确定,也可以通过把纹理贴到物体的表面而获得,或者是上述三种的混合产物。
  4. 把物体的数学描述以及与物体相关的颜色信息转换为屏幕上的像素。

2.一段简单的OpenGL代码

首先介绍几个术语:

  • 渲染(Rendering):计算机根据模型创建图像的过程。
  • 模型(model):根据几何图元建立,也可以称为物体。
  • 几何图元:包括点、直线和多边形等,它们是通过顶点(Vertex)指定的。
  • 位平面:一块内存区域,保存了屏幕上每个像素的1个位的信息。

最终完成了渲染的图像是由在屏幕上绘制的像素组成的。像素是显示硬件可以在屏幕上显示的最小可视化元素。在内存中,和像素有关的信息(如像素的颜色)组织成位平面的形式。

#include "stdafx.h"
#include <stdio.h>
#include <gl\GLUT.H>void myDisplay(void)
{glClearColor(0, 0, 0, 0); //窗口清除为黑色glClear(GL_COLOR_BUFFER_BIT); //实际完成窗口清除任务glColor3f(1.0, 1.0, 1.0);  //确定绘制物体时所使用的颜色glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); //确定所使用的坐标系统glBegin(GL_POLYGON);glVertex3f(0.25, 0.25, 0.0);glVertex3f(0.75, 0.25, 0.0);glVertex3f(0.75, 0.75, 0.0);glVertex3f(0.25, 0.75, 0.0);glEnd();glFlush(); //保证了绘图命令将实际执行
}void myReshape(GLsizei w, GLsizei h)
{glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);//当前矩阵glLoadIdentity(); //将当前矩阵置换为单位阵if (w <= h)gluOrtho2D(-1.0, 1.5, -1.5, 1.5*(GLfloat)h / (GLfloat)w); //定义二维正视投影矩阵elsegluOrtho2D(-1.0, 1.5*(GLfloat)h / (GLfloat)w, -1.5, 1.5);glMatrixMode(GL_MODELVIEW); //指明当前矩阵
}int _tmain(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(400, 400);glutInitWindowPosition(200, 200);glutCreateWindow("Square");glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);glutMainLoop();return 0;
}

解析:

函数myDisplay:

  • glClearColor:清除背景。
  • glClear:将buffer设置为预先设定的值。参数GL_COLOR_BUFFER_BIT表明现在可以向buffer中写入颜色值。
  • glColor3f:设置当前颜色。后面跟着的参数代表参数个数。3:是指带有三个参数,分别为红绿蓝。f:表示参数类型类型,GLfloat。
  • glBegin和glEnd是一一对应的。这两个函数限定了一组或者多组图元的顶点定义。在这两个函数之间就是我们绘制的由多个顶点组成的图元。函数的参数表明了所绘制的涂元的类型。GL_POLYGON表明了所绘制的图形为三角形。
  • glVertex指定顶点。同样函数明中的数字表明参数个数。参数分别为x,y或x、y、z。紧跟数字后面的字母表示数据类型。
  • glFlush迫使OpenGL函数在有限时间里运行。glFlush清空所有buffer,使所有发出的命令能在规定的时间内运行。一定不能忘记这一条语句。只有加了这一句,前面的命令才能执行

函数myReshape:

  • glViewport(Glint x,Glint y,GLsizei width,GLsizei height)设置视口。视口是一个矩形,x,y为视口左下角的坐标,以像素为单位,缺省值为(0,0)。width和height分别为视口的宽和高。OpenGl context第一次贴到窗口上时width和height分别设置成窗口的大小。
  • glMatrixMode 指明哪一个矩阵为当前矩阵。本例中GL_PROJECTION指明投影矩阵堆栈为随后的矩阵操作的目标。GL_MODELVIEW指明模型视景矩阵。
  • glLoadIdentity将当前矩阵置换为单位阵。
  • gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)定义二维正视投影矩阵。left,right分别设置左右垂直切平面的坐标,bottom,top分别设置上下垂直切平面的坐标。

OpenGL编程指南1:OpenGL简介相关推荐

  1. 《OpenGL编程指南》一第2章 着色器基础

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...

  2. OpenGL编程指南7:视图-

    1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...

  3. OpenGL编程指南5:学习绘制不同风格的曲线

    1.不同风格曲线绘制 #include <vgl.h> //宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续 #define drawOneLine( ...

  4. OpenGL编程指南4:双缓冲实现运行

    1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...

  5. OpenGL编程指南3:GLUT:OpenGL使用工具库

    1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...

  6. opengl编程指南第8版源码编译详细说明

    1. 到:https://github.com/openglredbook/examples 下载完全版的源码examples-master.zip,大小有131MB左右,不要下载缩略版的,否则\bi ...

  7. 《OpenGL编程指南(原书第8版)》——计算着色器

    原文  http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...

  8. 《OpenGL编程指南》一第3章 OpenGL绘制方式

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 Op ...

  9. 《OpenGL编程指南》一3.2 OpenGL缓存数据

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,第3.2节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...

  10. OpenGL编程指南(第八版)第一个渲染三角形案例代码在win8双显卡电脑VS2015中运行方法总结

    弄了好几天才把第一个程序运行出来,用该博客记录一下参考的博客资料及问题: 写得很好的博客参考资料为: http://blog.csdn.net/IceTeaSet/article/details/50 ...

最新文章

  1. mnist深度学习入门
  2. 分布式缓存系统Memcached简介与实践(.NET memcached client library)
  3. pythreejs is needed for plotting with pythreejs backend
  4. 使用dbcp连接池创建进行表的增删改查
  5. html显示php值,HTML窗体加载显示通过PHP的十六进制值
  6. php 中文键名 问题,PHP中使用asort进行中文排序失效的问题处理
  7. HTTP 头部解释,HTTP 头部详细分析,最全HTTP头部信息
  8. 颜宁:给实验室博士的一些忠告
  9. ECCV18|这篇论文开源的车牌识别系统打败了目前最先进的商业软件(附Github地址)...
  10. 使用nvl就不能groupby了吗_现在的手机大部分都不能换电池,使用1至2年就需要更换吗?...
  11. 机器人操作系统ROS是什么?
  12. php 改变图片大小,如何把照片尺寸改小 电子照片尺寸怎么改
  13. 2022软件测试技能 Apache JMeter 性能测试从入门到精通
  14. 【记录】easyexcel导出后打开文件报已损坏
  15. Sidney网站分析感悟:无细分,毋宁死
  16. 2011最牛高考作文:时间在流逝——上还是不上大学?
  17. kk的房《垃》产预《圾CXXN》测
  18. 利用python实现利用追赶法解决线性方程组
  19. Ichorbio/艾美捷 研究级阿达木单抗生物仿制药
  20. 第5章分数的位置及标准化分布

热门文章

  1. 【leetcode】56. Merge Intervals 相邻线段归并
  2. VIM配置ActionScript
  3. 瑞星:周末拦截挂马网站数减少 新闻类网站占主打
  4. bnuoj 20950 沉重的货物 (最小生成树)
  5. hdu 2159 FATE 二维背包
  6. 常见的加密和解密算法—MD5
  7. 各常用分类算法的优缺点总结:DT/ANN/KNN/SVM/GA/Bayes/Adaboosting/Rocchio
  8. Windows删除指定时间之前指定后缀名的文件
  9. HTML和CSS初级前端面试题汇总(持续补充)
  10. 修改默认runlevel