OpenGL学习(二)三角形

  • 顶点数组对象:Vertex Array Object,VAO,因为VBO只是数据,而VAO则包括VBO和它设置的状态,非常方便。VAO与VBO是一一对应的关系。
  • 顶点缓冲对象:Vertex Buffer Object,VBO,程序可以有多个内存块,也就会有多个VBO,具体是从哪个VBO获取则是通过在调用glVertexAttribPointer时绑定到GL_ARRAY_BUFFER的VBO决定的。相当于激活吧。
  • 索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO

3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。

图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。感觉还是蛮好懂的,就不解释了。

每一个转换阶段都有一个小程序执行,这些小程序叫做着色器(Shader)。这些小程序不在CPU,而是在GPU上运行。这些小程序用的代码并不是C语言代码。

例如一个转换过程由6个着色器依次完成。

顶点数据(Vertex Data)是描述一个物体所有顶点的数组;顶点数据是一系列顶点的集合。一个顶点(Vertex)是一个3D坐标的数据的集合。而顶点数据是用顶点属性(Vertex Attribute)表示的,因为还会有颜色属性或者别的。简单起见,我们还是假定每个顶点只由一个3D位置和一些颜色值组成。

为了让OpenGL知道我们的坐标和颜色值构成的到底是什么,OpenGL需要你去指定这些数据所表示的渲染类型。我们是希望把这些数据渲染成一系列的点?一系列的三角形?还是仅仅是一个长长的线?做出的这些提示叫做图元(Primitive),任何一个绘制指令的调用都将把图元传递给OpenGL。这是其中的几个:GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP。这个就是函数中的一个参数吧。

六个着色器分别为:

顶点着色器(Vertex Shader),它把一个单独的顶点作为输入。顶点着色器主要的目的是把3D坐标转为另一种3D坐标,同时顶点着色器允许我们对顶点属性进行一些基本处理。

图元装配(Primitive Assembly),将顶点着色器输出的所有顶点作为输入,并所有的点装配成指定图元的形状

几何着色器(Geometry Shader)。几何着色器把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状。

光栅化阶段(Rasterization Stage),这里它会把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。

片段着色器的主要目的是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。在片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率。

Alpha测试和混合(Blending)阶段。这个阶段检测片段的对应的深度,用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(透明度)并对物体进行混合(Blend)。

然而,对于大多数场合,我们只需要配置顶点和片段着色器就行了。几何着色器是可选的,通常使用它默认的着色器就行了。

在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)。

OpenGL仅当3D坐标在3个轴(x、y和z)上都为-1.0到1.0的范围内时才处理它。所有在所谓的标准化设备坐标(Normalized Device Coordinates)范围内的坐标才会最终呈现在屏幕上(在这个范围以外的坐标都不会显示)。

顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大量顶点。感觉现在明白多了。之所以叫对象是因为它不仅仅只存储坐标,还有比如颜色等很多东西。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。从CPU把数据发送到显卡相对较慢,所以只要可能我们都要尝试尽量一次性发送尽可能多的数据。当数据发送至显卡的内存中后,顶点着色器几乎能立即访问顶点,这是个非常快的过程。

索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO),是为了减少重复点使用,使用路径的方法进行画图,EBO也是一个缓冲,它专门储存索引

 

 

 

每日一个小常识:

因为字符串的关系,最好不要在字符串shader里面写任何注释,不然容易出现编译错误。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值