OpenGL编程指南1:OpenGL简介
1.什么是OpenGL?
OpenGL对场景中的图像进行渲染时所执行的主要图形操作:
- 根据几何图元创建形状,从而建立物体的数字描述。(OpenGL把点、直线、多边形和位图作为基本的图元)。
- 在三维空间中排列物体,并选择观察复合场景的有利视角。
- 计算所有物体的颜色。颜色可以有应用程序明确指定,可以根据特定的光照条件确定,也可以通过把纹理贴到物体的表面而获得,或者是上述三种的混合产物。
- 把物体的数学描述以及与物体相关的颜色信息转换为屏幕上的像素。
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简介相关推荐
- 《OpenGL编程指南》一第2章 着色器基础
本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...
- OpenGL编程指南7:视图-
1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...
- OpenGL编程指南5:学习绘制不同风格的曲线
1.不同风格曲线绘制 #include <vgl.h> //宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续 #define drawOneLine( ...
- OpenGL编程指南4:双缓冲实现运行
1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...
- OpenGL编程指南3:GLUT:OpenGL使用工具库
1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...
- opengl编程指南第8版源码编译详细说明
1. 到:https://github.com/openglredbook/examples 下载完全版的源码examples-master.zip,大小有131MB左右,不要下载缩略版的,否则\bi ...
- 《OpenGL编程指南(原书第8版)》——计算着色器
原文 http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...
- 《OpenGL编程指南》一第3章 OpenGL绘制方式
本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 Op ...
- 《OpenGL编程指南》一3.2 OpenGL缓存数据
本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,第3.2节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...
- OpenGL编程指南(第八版)第一个渲染三角形案例代码在win8双显卡电脑VS2015中运行方法总结
弄了好几天才把第一个程序运行出来,用该博客记录一下参考的博客资料及问题: 写得很好的博客参考资料为: http://blog.csdn.net/IceTeaSet/article/details/50 ...
最新文章
- mnist深度学习入门
- 分布式缓存系统Memcached简介与实践(.NET memcached client library)
- pythreejs is needed for plotting with pythreejs backend
- 使用dbcp连接池创建进行表的增删改查
- html显示php值,HTML窗体加载显示通过PHP的十六进制值
- php 中文键名 问题,PHP中使用asort进行中文排序失效的问题处理
- HTTP 头部解释,HTTP 头部详细分析,最全HTTP头部信息
- 颜宁:给实验室博士的一些忠告
- ECCV18|这篇论文开源的车牌识别系统打败了目前最先进的商业软件(附Github地址)...
- 使用nvl就不能groupby了吗_现在的手机大部分都不能换电池,使用1至2年就需要更换吗?...
- 机器人操作系统ROS是什么?
- php 改变图片大小,如何把照片尺寸改小 电子照片尺寸怎么改
- 2022软件测试技能 Apache JMeter 性能测试从入门到精通
- 【记录】easyexcel导出后打开文件报已损坏
- Sidney网站分析感悟:无细分,毋宁死
- 2011最牛高考作文:时间在流逝——上还是不上大学?
- kk的房《垃》产预《圾CXXN》测
- 利用python实现利用追赶法解决线性方程组
- Ichorbio/艾美捷 研究级阿达木单抗生物仿制药
- 第5章分数的位置及标准化分布
热门文章
- 【leetcode】56. Merge Intervals 相邻线段归并
- VIM配置ActionScript
- 瑞星:周末拦截挂马网站数减少 新闻类网站占主打
- bnuoj 20950 沉重的货物 (最小生成树)
- hdu 2159 FATE 二维背包
- 常见的加密和解密算法—MD5
- 各常用分类算法的优缺点总结:DT/ANN/KNN/SVM/GA/Bayes/Adaboosting/Rocchio
- Windows删除指定时间之前指定后缀名的文件
- HTML和CSS初级前端面试题汇总(持续补充)
- 修改默认runlevel