OpenGL入门之路(1)

首先要了解几个名词:
顶点数组对象:Vertex Array Object,VAO
顶点缓冲对象:Veetex Buffer Object,VBO
索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO
在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致了OpenGL大部分工作都是关于把3D坐标转变成适应自己屏幕的2D像素。
3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多数译成管线,实际上指的是一堆原始数据途径一个输送管道,期间经过各种变化处理最终出现在屏幕上的过程)管理的。
图形渲染管线主要划分成两个部分:1>3D坐标转成2D坐标。2>把2D坐标转变为实际的有颜色的像素。
ps:2D坐标和2D像素是不同的.2D坐标精确的表示一个点在2D空间中的位置.2D像素是这个点的近似值。收到屏幕/窗口分辨率的限制。
图形渲染管线接受一组3D坐标,然后把他们转变成屏幕上有色的2D像素输出。图形渲染管线可以被分成几个极端。每个阶段会把前一个阶段的输出作为输入。现在的显卡由成千上万的小处理核心,他们在
GPU上为每一个(渲染管线)阶段运行各自的小程序。这些小程序叫做着色器(Shader)。

图形渲染管线的阶段:

1.顶点着色器 2.形状装配 3.集合着色器 4.光栅化 5.片段着色器 6.测试与混合

我们可以进行编程改变的只有顶点着色器和片段着色器
1.顶点着色器:

他把一个单独的顶点作为输入。顶点着色器主要的目的是把3D坐标转船成另一种3D坐标。同事顶点着色器允许我们对顶点属性进行一些基本处理。

2.图元装配:

讲顶点着色器输出的所有顶点作为输入(如果是GL_POINTS,那么就是一个顶点)并将所有的顶点装配成指定图元的形状;本次用三角形。

3.几何着色器:

几何着色器把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的或者是其他的图元来生成其他形状,本次又生成了一个三角形。

4.光栅化阶段:

这里他会把图元映射为最终屏幕上相应的像素,生成供片段着色器使用的片段(fragment),在片段着色器运行之前回执行裁切。裁切回丢弃超出你的试图以外的所有像素,用来提升执行效率。

5.片段着色器:

主要目的是计算一个像素的最终颜色,这也是所有PenGL高级效果产生的地方,通常,片段着色器包含3D场景的数据(比如光照,阴影,光的颜色等等),这些数据可以用来计算最终像素的颜色。

6.Alpha测试和混合阶段:

这个阶段检查片段的对应深度(和模板(Stenci))值。用他们来判断这个像素是其他物体的前面还是后面,决定是否应该丢弃。这个阶段也回检查alpha值(透明度)并对物体进项混合。所以,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。

图形渲染管线非常复杂。它包含了很多可配置的部分。然而,对于大多数场合,我们只需要配置顶点和片段着色器就行了,几何着色器是可选的。通常使用他默认的着色器就行了。
在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)。出于这个原因,刚开始学习现代OpenGL的时候可能会很困难,因为你能够渲染自己的第一个三角形之前已经需要了解一大堆知识了。
顶点输入:只有3D坐标的每个值都在-1~1之间的范围内才能处理它。所有在所谓的标准化设备坐标范围内的坐标才会最终呈现在屏幕上(在这个范围以外的坐标都不会显示)。

标准化设备坐标:

一旦顶点坐标已经在顶点着色器中处理过了。他们就应该是标准化设备坐标了。标准化设备坐标是一个x,y和z的值在-1.0~1.0的一小段空间。任何落在范围外的坐标都会呗丢弃/裁剪。不会显示在屏幕上。
与通常的屏幕不同,0,0是屏幕中心。y轴正方向朝上。标准化设备坐标接着会变化成屏幕空间坐标。这是使用glViewport函数提供的数据,进行视口变换完成的。所得的屏幕坐标又会转换成片段输入到片段着色器中。
着色器程序:
是多个着色器河滨之后并最终链接完成的版本。如果要使用刚才编译的着色器我们必须把他们链接为一个着色器对象,然后在渲染对象的时候激活这个着色器程序,已激活着色器程序的着色器将在我们发送渲染调用的时候被使用。
当链接着色器至一个程序的时候,他会把每个着色器的输出链接到下一个着色器的输出,当输出和输入不匹配的时候,你会得到一个连接错误。

链接顶点属性:

顶点着色器允许我们质地很难过任何以顶点属性为形式的输入。这使其句有很强的灵活性的同事,还意味着我们必须手动指定输入数据的哪一个部分对应顶点着色器的哪一个顶点属性。所以我们在渲染前指定OpenGL该如何解释顶点数据。
顶点缓冲数据会被解析为:1.每个数据被储存为32位的浮点值。2.每个位置包含三个3个这样的值。3.这三个值之间没有空袭。这几个之在数组中紧密排列(Tightly Packed)。4.数据中第一个值在缓冲开始的位置。
有了这些信息我们就可以使用 glVertexAttribPointer函数告诉OpenGL该如何解析顶点数据(应用到逐个顶点属性上)了:
glVertexAtrribPointer函数的参数非常多:
*第一个参数指定我们要配置的顶点属性.在顶点着色器中使用layout(location = 0)定义了postion顶点属性的位置值设置为0.因为我们希望把数据传递到这一个顶点属性中。
*第二个参数指定顶点属性的大小。顶点属性是一个vec3,它由3个值组成,所以大小是3。
*第三个参数指定数据的类型,都是由浮点数构成的。
*下个参数定义我们是否希望数据被标准化。如果我们设置为GL_TRUE。所有的数据都会被映射到0到1之间。这里我们设置成Flase。
第五个参数叫做步长。他告诉我们在连续顶点属性组之间的间隔。由于下个组位置数据在3个float之后。我们把步长设置为3sizeof(float)。注意的是我们知道这个数组是紧密排列的。我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用),
至此。我们使用了一个顶点缓冲对象将顶点数据初始化到缓冲中。建立了一个顶点和一个片段着色器,并告诉了OpenGL如何把顶点数据链接到顶点着色器的顶点属性上。在OpenGL中绘制一个物体。

顶点数组对象(VAO):

顶点数组对象可以想顶点缓冲对象那样被绑定,任何随后的顶点属性调用都会储存在这个VAO中。这样的好处就是,当配置顶点属性指针时。只需要将那些调用执行一次,之后在绘制物体的时候只需要绑定相应的VAO就行了。刚刚设置的所有状态都保存在VAO中。
*OpenGL的核心模式要求我们必须使用VAO
一个顶点数组对象会储存下面这些东西
1.glEnableVextexAttribArray和glDisableVertexAttribArray的调用
2.通过glVertexAttribPointer设置的顶点属性配置
3.通过glVertexAttrbPointer调用与顶点属性关联的顶点缓冲对象。

索引缓冲对象(EBO):

假设我们不再绘制一个三角形而是绘制一个矩形。我们可以绘制两个三角形来组成一个矩形(OpenGL主要处理三角形)。这会生成6个顶点数据。有两个顶点叠加了。这样就产生了50%的额外开销。如果包含上前个三角形的模型就会更糟糕。
更好的解决方案是只储存不同的顶点。并绘制这些顶点的顺序。这样子我们就只需要储存四个顶点就可以绘制矩形了。之后只需要指定绘制顺序就行了。
索引缓冲对象的工作方式就是这样的。和顶点缓冲对象一样,EBO是一个缓冲。他专门储存索引,OpenGL调用这些顶点的索引来决定该绘制哪个顶点。所谓的索引绘制正是解决方案。首先,要定义不重复的顶点,和绘制出举行所需的索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值