《Computer Graphics with OpenGL》计算机图形学读书笔记 02——计算机图形学软件
这里是《Computer Graphics with OpenGL》英文原版第四版的读书笔记,预计每一章写一篇读书笔记。本篇为第二章,简要介绍计算机图形学的相关软件。图形学相关软件可分为两类——专业类、综合类。其中,专业类为非编程人员准备,可提供如美术、CAD绘图等功能。综合类为编程人员使用,可以通过代码直接控制绘图过程。
坐标表示
将放置好的物体显示在屏幕上要经历一系列复杂的步骤,进行若干次的坐标变换。主要步骤如下:
- 模型坐标空间:在其中设定好各个零部件内部的位置信息
- 世界坐标空间:将模型放置在世界中
- 观察坐标空间:将观察者(摄像机)位置设为原点,观察方向为正方向的坐标系中的顶点位置
- 标准坐标空间:将三维坐标转化为二维坐标,并归一化至0~1或-1~1,使其不受不同分辨率、纵横比的显示设备所影响
- 屏幕坐标空间:根据具体的屏幕设置将其转化为对应的像素位置信息
图形函数
一个图形包中有许多不同的功能,可以将其分类如下:
- 基础的图形输出:点、直线、曲线、球、圆柱等等的绘制
- 属性:用于控制如何绘制基础图形,如颜色、线型、填充方式等
- 几何变换:大小、位置、旋转
- (可选)模型变换:通常会提供针对复杂模型的构建功能,即使用树形结构将模型的各个零部件进行连接
- 显示变换:将图形显示到输出设备上,如更改场景视图、投射方式、相机位置、光照等
- 输入函数:控制输入
- 控制操作:如清空屏幕、初始化参数等
软件标准
为了保证在某一硬件设备上使用图形包所完成的工作在其他硬件上的可移植性,需要制定具体的标准。目前存在过的标准如下:
- Graphical Kernal System(GKS):第一个图形软件标准,主要为二维
- Programmer’s Hierarchical Interactive Graphic System(PHIGS):GKS的扩展
- PHIGS+:增加了三维渲染
- Graphics Library(GL):主要为快速的实时渲染所设计
- OpenGL:三维为主,当z=0时可表示二维,是当前最流行的图形软件包
其它图形包
这里简单列举,不做具体介绍:
Open Inventor、Virtual-Reality Modeling Language(VRML)、Java 2D、Java 3D、RenderMan Interface
OpenGL介绍
基础语法
- 基本库:gl开头,接下来的单词第一个字母大写,如glBegin,glClear,glCopyPixels,glPolygonMode等
- 符号常量:GL开头,接下划线和大写字母,如GL_2D,GL_RGB,GL_CCW,GL_POLYGON,GL_AMBIENT_AND_DIFFUSE等
特殊数据类型:GL开头,接小写单词,如GLbyte,GLshort,GLint,GLfloat,GLdouble,GLboolean等
一些函数的参数会使用指向数组的指针来完成调用。
相关库
- OpenGL Utility(GLU):函数名称以glu开头,主要包括视口设置、投影矩阵、复杂物体近似、表面渲染等复杂操作
- Open Inventor:一些预定义的复杂物体形状和三维应用
- OpenGL Utility Toolkit(GLUT):函数名称以glut开头,提供了与各类不同系统(Windows,Apple等等)屏幕显示系统的接口。
头文件
通常可以使用
#include<GL/glut.h>
或#include<GLUT/glut.h>
直接代替以下的复杂头文件:
#include<windows.h>#include<GL/gl.h>#include<GL/glu.h>
使用GLUT进行Windows窗口展示
- 初始化GLUT:glutInit(&argc, argv);
- 创建窗口并赋名:glutCreateWindow(“An Example OpenGL Program”);——参数为该窗口的标题栏名称
- 创建图片:glutDisplayFunc(lineSegment);——这里的参数是一个在其他位置定义好的函数,通过调用绘制函数中所提供的操作
- 完成创建过程:glutMainLoop();——必须放在代码的最后,进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环,同时等待输入
- 设置窗口位置:glutInitWindowPosition(50, 100);——以屏幕的左上角为原点,以像素为单位
- 设置窗口大小:glutInitWindowSize(400, 300);——窗口的长度、宽度,单位为像素
- 设置显示模式:glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);——这里的两个参数为默认参数
一个完整的OpenGL程序
- 选择背景颜色:glClearColor(1.0, 1.0, 1.0, 0.0);——分别代表RGBA的值,这里为白色,该函数并没有把显示窗口放到屏幕上,而是使用该颜色值清空了缓存区,要想从缓存中将该函数的值读取到屏幕中,需要调用函数glClear(GL_COLOR_BUFFER_BIT);——该函数的参数是代表颜色缓存中的比特值的常量
- 设置颜色:glColor3f(0.0, 0.4, 0.2);——其中“3”和“f”都是可选参数,所设置的颜色对下面的代码都管用,后出现的glColor3f颜色会覆盖前面的glColor3f对再接下来的代码产生作用
- 使用二维场景所需的操作:glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 200.0, 0.0, 150.0);——窗口大小即位置为(从左下角开始)x轴0-200,y轴0-150,该范围外的图像不会显示
- 绘制图像的过程:
glBegin(GL_LINES);
…glVertex2i(180, 15);——左下角为原点
…glVertex2i(10, 145);
glEnd(); - 使所有OpenGL函数开始运行:glFlush();——强制刷新缓冲,保证绘图命令将被执行,而不是存储在缓冲区中等待其他的OpenGL命令
下面是一个完整的OpenGL例子:
#include <GL/glut.h> //or othersvoid init(void)
{glClearColor(1.0, 1.0, 1.0, 0.0); //Set diplay-window color to whiteglMatrixMode(GL_PROJECTION); //Set projection parametersgluOrtho2D(0.0, 200.0, 0.0, 150.0);
}void lineSegment(void)
{glClear(GL_COLOR_BUFFER_BIT); //Clear display windowglColor3f(0.0, 0.4, 0.2); //Set line segment color to greenglBegin(GL_LINES);glVertex2i(180, 15); //Specify line-segment geometryglVertex2i(10, 145);glEnd();glFlush(); //Process all OpenGL routines as quickly as possible
}void main(int argc, char** argv)
{glutInit(&argc, argv); //Initialize GLUTglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //Set display modeglutInitWindowPosition(50, 100); //Set top-left display-window positionglutINitWindowSize(400, 300); //Set display-window width and heightglutCreateWindow("An Example OpenGL Program") //Create display windowinit(); //Execute initialization procedureglutDisplayFunc(lineSegment); //Send graphics to display windowglutMainLoop(); //Display everything and wait
}
OpenGL中的错误处理
推荐在每个程序中都加入一个通用的错误报告函数,如:
#include <stdio.h>GLenum erorCheck()
{glenum code;const GLubyte *string;code = glGetError();if(code != GL_NO_ERROR){string = gluErrorString(code);fprintf(stderr, "OpenGL error: %s\n", string);}return code;
}
《Computer Graphics with OpenGL》计算机图形学读书笔记 02——计算机图形学软件相关推荐
- 《3D Math Primer for Graphics and Game Development》读书笔记1
<3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...
- 《计算机基础知识》读后感300字,计算机知识读书笔记
计算机知识读书笔记 计算机基础知识学习包括学电脑入门教程,电脑技巧,网络技术,办公软件,操作系统,视频教程等.以下是小编搜集并整理的计算机知识读书笔记有关内容,希望在阅读之余对大家能有所帮助! 计算机 ...
- 推荐系统实践读书笔记-02利用用户行为数据
推荐系统实践读书笔记-02利用用户行为数据 为了让推荐结果符合用户口味,我们需要深入了解用户.如何才能了解一个人呢?<论语·公冶长>中说"听其言,观其行",也就是说可以 ...
- 《深入理解计算机系统》读书笔记-02
CSAPP读书笔记-02 浮点数陷阱 在第二章最初,给出了"浮点运算是不可结合的"这样一个结论,乍一看有点令人费解,但仔细看了看例子,发现其实结合浮点数在内存中的存储方式反而很容易 ...
- 大数据之路读书笔记-02日志采集
大数据之路读书笔记-02日志采集 数据采集作为阿里大数据系统体系的第 环尤为重要.因此阿里巴巴建立了一套标准的数据采集体系方案,致力全面.高性能.规范地完成海量数据的采集,并将其传输到大数据平台.本章 ...
- 区块链读书笔记02 - 区块链进阶
区块链读书笔记02 - 区块链进阶 区块链的技术架构 区块链的工作流程 时间戳的作用 区块链的共识机制 工作量证明(PoW) 权益证明(PoS) PoW+PoS 股份授权证明 瑞波共识协议 参考文献 ...
- 计算机图形学 读书笔记(八) 光线跟踪加速Ray Tracing Acceleration
写个读书笔记,一来作为字典以后可以查,二来记录自己的理解. 并没有对每个知识点的详细解释,大部分只有主观的定性的解释. 光线跟踪受到的限制: 1.时间复杂度和空间复杂度都很高. 2.主要时间用在了可见 ...
- 计算机图形学 读书笔记(一) 基础概念
写个读书笔记,一来作为字典以后可以查,二来记录自己的理解. 并没有对每个知识点的详细解释,大部分只有主观的定性的解释. 大量的配图用的清华大学的PPT里的图,会不会有版权问题呀....让我删我就删.. ...
- 计算机图形学 读书笔记(五) 网格参数化 Triangulated Surface Parameterization
写个读书笔记,一来作为字典以后可以查,二来记录自己的理解. 并没有对每个知识点的详细解释,大部分只有主观的定性的解释. 网格参数化的意义: 提供了网格和其他domain(如贴图)的映射,即:将一个三维 ...
最新文章
- java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...
- stopImmediatePropagation函数和stopPropagation函数的区别
- 题目1023:EXCEL排序
- 中国担保市场竞争战略规划与运营效益分析报告2022-2027年版
- MYSQL从节点延迟问题原因及解决
- html中高与行高的区别,深入了解css的行高Line Height属性
- 微信 SDK 升级,全面支持异步缓存接口, .NET 3.5/4.0版本5月1日起停止更新
- mini2440 uboot使用nfs方式引导内核,文件系统
- 中学计算机课程课时,初中信息技术基础教案设计(课时).doc
- Thinking in Java 11.13 Foreach与迭代器
- Python新手需要掌握的知识点
- linux scp命令 将数据从一台linux服务器复制到另一台linux服务器
- 基于c语言的移动通信调制,π/4-QPSK调制方式及其与GSMK调制方式的比较
- 网易云音乐API-本地node开启
- Ubuntu 字符终端
- mac 删除磁盘图标_如何在Mac上更改硬盘图标
- Dashboard Design 4.0(Xcelsius)数据直接绑定功能:瑕瑜互见
- New Bing新必应内测资格申请教程,无需科学上网,一分钟搞定!
- C语言结构体(struct)的几种定义方式
- Java反射 Class类常用方法详解