OpenGL红宝书正序解读(一)
首先这是我的第一篇博客,如果有什么笔误或者错误,我希望读者能在评论区提出来,或者读者有什么问题也可以像我提出来,每一条评论我都会看,而且我都会回复,我希望大家能一起进步。由于我是一个OpenGL小白,我也是跟着博客的进度一点点学习的,希望大家不要喷我水平低,然后做一下本人的自我介绍,本人大三,编程语言会c,c++,python,js,水平参差不齐,所以希望大家不要嫌弃我,也希望大家如果看了这篇文章有所收获,可以看我每篇文章,谢谢!
本人所用教材为opengl红宝书第七版,看此博客必须看书!
第一章:OpenGL简介
第一章的内容可以看作是整本书的一个概括,其中涉及到一些个零零散散的基本概念我先不做过多的赘述,后续的介绍会给大家渗透基本知识,我是按照一个新手到高手的阶梯进行介绍的,大家不要着急,所以第一章我们选择略过。
第二章:状态管理和绘制几何物体
大家想学习opengl的目的我想都是对图形学感兴趣,OpenGL就是用来做艺术家做的事情,我们在电脑上画画,我们的笔就是OpenGL。
大家看一下这个标题,提到了一个词状态有点难懂,我们把opengl看作一台机器,也可以看成是我们小时候买的那种一根笔可以换好几种颜色的那种笔,我们给OpenGL设置一个状态,他就开始接下来在这种状态的运行,就像我们换了个红色,这只特殊的笔在我们接下来的使用中,就会是红色。
OpenGL有很多的状态,我们首先知道要如何使用以及如何管理,同时本章最有意思的,就是教我们如何绘制几何物体。
书中正式开始介绍内容之前,有一段引言是非常重要的,说:所有我们在计算机中绘制的复杂图形,都是由最简单的图形组成的。大家应该知道,我们的计算机的能力没有那么大,厂商生产这个有关图形的硬件的时候,他为了简单,就让我们的硬件设备具有绘制基本图形的能力,基本图形指的是:矩形 ,三角形(应用最多)…反正都是一些基本图形,还有一个茶壶是例外,我们绘制的所有图形,都是这些图形组成的,就像线是由点组成的一样。
绘图工具箱
这里讲的跟绘制几何图形没有半毛钱关系,但是,你画图必须用到这些,首先,我们得建立一个窗口什么的来展示图形,然后还得准备好给图形上的色,最后,我们强制图形在屏幕上画出来。
清除窗口
我们在内存中存放一个图片时,这个内存一般情况下是被计算机之前绘制的图形所占用的,这就意味着我们的显示屏幕就不是纯白色啦,反正不是你心里应该有的那种默认颜色,所以我们要首先清除窗口。书中提到了一种不知道谁想出来的问题,我是没想到,说是要用一个矩形来填充,反正这种方法不好嘻嘻,感兴趣的可以了解一下。
颜色在硬件里的存储地方叫位平面,有两种存储方法:RGBA和索引值存储法(这种方法不常见,可以不学,而且应该是面临被该版本OpenGL抛弃的征兆)。RGBA分别代表了红色,绿色,蓝色,还有一个alpha值,别问我这个alpha是啥,我刚看完第二章,我也不知道哈哈。
p21页给出了一个例子(所以我说看博客,必须有书)。
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
例子就是这两行!短的代码我会手打,长的自己看书!
第一行就是三种颜色都没有,那不是就是漆黑一片!所以设置的我们的默认清除颜色为黑色,每当我们调用glclear,嘿嘿,你调用也得看看glClear是咋写的啊!这里glClear的参数是这个东西,代表了我们清除的是颜色缓冲区的东西,那么在这两行代码生效以后,缓冲区的颜色被清除了,屏幕上的图像还是原样。你在程序的开头设置好了清除颜色以后,OpenGL会把这个颜色当作一个状态变量,也就是笔的一种颜色,他在后面的代码中都有效。
然后一个重点:三种颜色的取值范围是0.0-1.0
然后啊,glClear()这个函数有一个参数,就是我们要清除的缓冲区的名字(有关缓冲区,大家不要较真,一会会讲到)。缓冲区名字如下:
GL_COLOR_BUFFER_BIT 颜色缓冲区
GL_DEPTH_BUFFER_BIT 深度缓冲区
GL_ACCUM_BUFFER_BIT 累计缓冲区
GL_STENCIL_BUFFER_BIT 模板缓冲区
还有个重点,比如说我们想清除颜色缓冲区和深度缓冲度,那么我们可以利用逻辑运算符“|”,你用这个运算符比你一个个的调用glClear要快!记住!要快!
指定颜色
我们的指定颜色的函数:glColor3f(),在这里3代表函数里的参数有三个,f代表了参数的数据类型为浮点数,三个的原因是因为alpha值可以是默认的,默认为0.0,而且我们也用不到,那就干脆是默认的吧,如果用到的话,我们也可以写glColor4f()。
接下来说一个颜色操作序列的问题,比如说我先设置了一个颜色,之后我画图了,那么我画的图就都是这个颜色,之后我又设置了另外一种颜色,那么我接下来画的图又都是第二种颜色(大家好好理解状态机的问题吧)。
强制完成绘图操作
这里涉及两个函数 glFlush()和glFinish()我看书上的意思,我们用glFlush就可以,而且过多的使用glFinish会降低系统性能。
说说为啥我们要强制绘图完成:
1.我想让程序走的快点(最普通的理解)
2.cpu傻,本来我们的这一个程序有很多硬件合作完成,cpu非得死心眼等着她发的这个命令结束了才执行下一条,如果不等结束,直接进入下一条,那么硬件都会运作起来,这样大家一起干活,效率多高。
3.这里涉及到一个概念:客户机和服务器,我们现在用的叫客户机,那服务器在哪啊,服务器就是我们的图形处理硬件。我们绘图必须得需要这些硬件的帮忙才可以。假如说 这个服务器,这些硬件不是你电脑上的,是我电脑上的,那你就得通过网络给我发过来,然后我处理,你发指令,有个问题就是你是通过数据包给我发的,你这个数据包不满,你就总不想发,怕费流量,那就得等,那多么的慢,所以我们利用glFlush让我们的程序比普通情况下跑得更快,就是因为它克服了上面两个瓶颈。
坐标系统工具箱
如果我们有个窗口,那我们不管是移动窗口,还是重置它的大小。glut都会发个信号,我们可以在这个时候写个函数,每当你动窗口,这个函数就会触发,glutReshapeFunc(),只有一个参数,是函数名。
描述点、直线、多边形
什么是点、直线、多边形
点:在OpenGL中,点是用三维坐标来实现的,都是浮点数,但是由于浮点数的精度问题,两个不同的点,可能是同一个点,而且,在绘制图像的时候,最小的单位是像素,两个不同的点,可能在同一个像素里。(四维坐标不常见,大家有兴趣的看看)
直线:直线是线段!而且直线是用顶点来指定的。
多边形:多边形是直线闭合组成的,绘制多边形,可以选择填充内部,只画边界,或者用点来画。多边形必须是凸多边形,为了方便多边形的渲染,我们一般选择用三角形来组成这些多边形来进行渲染,因为三角形总是位于一个平面内。
矩形