对光栅化的理解和总结

什么是缓冲区?

当每个像素按照统一的方式存储时,存储所有像素的空间就叫做缓冲区。

帧缓冲区主要包含了以下几种缓冲区:颜色缓冲区、深度缓冲区、模板缓冲区、累计缓冲区。

颜色缓冲区:它用于保存屏幕上所显示的颜色信息是绘图的一块内存它们包含了颜色索引和RGB颜色数据,还包括了alpha数据。

深度缓冲区:它存储了颜色的深度信息。深度通常是由物体与观察点之间进行测量的,因此具有较大的深度值的像素会被较小深度值得像素被覆盖。深度缓冲区又被成为Z缓冲区(x表示屏幕的水平方向,y表示垂直方向,z表示观察点垂直于屏幕的方向。)

模板缓冲区:他的主要用途就是把绘图限制在屏幕的某个区域,就像纸板和画笔实现精确的绘制图像一样。

累计缓冲区:通常与RGBA模式下的颜色缓冲区一样,累计缓冲区也用于存储RGBA颜色数据。累计缓冲区通常用于把一系列的的图像合成一副图像,通过这种方法可以对图像进行超级采样,然后对样本求取平均值,将结果写入颜色缓冲区当中,从而实现了场景的抗锯齿处理。不能把数据直接写入累计缓冲区当中,累计操作总是以矩形块为单位对数据进行操作,通常是把数据移入或者移出颜色缓冲区。

好了有了缓冲区的概念下面总结光栅化的作用。

光栅化(Rasterization)是把顶点数据转换为片元的过程,具有将图转化为一个个栅格组成的图象的作用,特点是每个元素对应帧缓冲区中的一像素。光栅化其实是一种将几何图元变为二维图像的过程。

该过程包含了两部分的工作。

第一部分工作:决定窗口坐标中的哪些整型栅格区域被基本图元占用。

第二部分工作:分配一个颜色值和一个深度值到各个区域,光栅化过程产生的是片元。

什么是顶点数据?什么是片元?这些概念是关于可编程管线的概念,也就是我们所知道的顶点着色器,片元着色器。也就是顶点着色器数据传递给片元着色器在进行处理颜色像素等。

顶点数据

顶点数组(VertexArray)
顶点指的是我们在绘制一个图形时,它的顶点位置数据,而这个数据可以直接存储在数组中或者将其缓存到GPU内存中

顶点数组指定每个顶点的属性,是保存应用程序地址空间的缓冲区。他们作为顶点缓冲对象的基础,提供指定顶点属性数据的一个高效、灵活的手段

顶点缓冲区(VertexBuffer)
顶点数组指定的顶点数据保存在客户内存中。在进行glDrawArrays或者glDrawElements等绘图调用时,这些数据必须同客户内存复制到图形内存。

没必要每次绘图时都复制顶点数据,而是在图形内存中缓存这些数据,这样可以显著改善渲染性能,也可以降低内存带宽和电力消耗需求。这就是顶点缓冲区对象发挥作用的地方

顶点数组对象:Vertex Array Object,VAO
顶点缓冲对象:Vertex Buffer Object,VBO
索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO

在定义好顶点数据以后,需要在内存中存储这些顶点,我们通过顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大量顶点。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。从CPU把数据发送到显卡相对较慢,所以只要可能我们都要尝试尽量一次性发送尽可能多的数据。当数据发送至显卡的内存中后,顶点着色器几乎能立即访问顶点,这是个非常快的过程。

缓冲区保存在GPU内存中, 可以在CPU不介入的情况下,完成数据操作。

顶点着色器

① 顶点着色器应该接收的是一种特殊形式的输入,否则就会效率低下。顶点着色器的输入特殊在,它从顶点数据中直接接收输入。

② 为了定义顶点数据该如何管理,我们使用location这一元数据指定输入变量,这样我们才可以在CPU上配置顶点属性。比如:layout (location = 0)。顶点着色器需要为它的输入提供一个额外的layout标识,这样我们才能把它链接到顶点数据。

③ 为了设置顶点着色器的输出,我们必须把位置数据赋值给预定义的gl_Position变量,它在幕后是vec4类型的。在main函数的最后,我们将gl_Position设置的值会成为该顶点着色器的输出。由于我们的输入是一个3分量的向量,我们必须把它转换为4分量的。我们可以把vec3的数据作为vec4构造器的参数,同时把w分量设置为1.0f(我们会在后面解释为什么)来完成这一任务。

④ 将更多的属性数据如颜色等添加进顶点数据中:

- 调整顶点着色器,使它能够接收颜色值作为一个顶点属性输入。需要注意的是我们用layout标识符来把aColor属性的位置值设置为1。

- 因为我们添加了另一个顶点属性,并且更新了VBO的内存,我们就必须重新配置顶点属性指针。

片段着色器

① 片段着色器(Fragment Shader)是第二个也是最后一个我们打算创建的用于渲染三角形的着色器。片段着色器所做的是计算像素最后的颜色输出。

② 片段着色器需要一个vec4颜色输出变量,因为片段着色器需要生成一个最终输出的颜色。如果你在片段着色器没有定义输出颜色,OpenGL会把你的物体渲染为黑色(或白色)。

③ 段着色器中进行的所谓片段插值(Fragment Interpolation)的结果。当渲染一个三角形时,光栅化(Rasterization)阶段通常会造成比原指定顶点更多的片段。光栅会根据每个片段在三角形形状上所处相对位置决定这些片段的位置。

④ 基于这些位置,它会插值(Interpolate)所有片段着色器的输入变量。比如说,我们有一个线段,上面的端点是绿色的,下面的端点是蓝色的。如果一个片段着色器在线段的70%的位置运行,它的颜色输入属性就会是一个绿色和蓝色的线性结合;更精确地说就是30%蓝 + 70%绿。

⑤ 这也就是为什么只设置了顶点的颜色,画出来的三角形都有颜色了。即:我们有3个顶点,和相应的3个颜色,从这个三角形的像素来看它可能包含50000左右的片段,片段着色器为这些像素进行插值颜色。如果你仔细看这些颜色就应该能明白了:红首先变成到紫再变为蓝色。片段插值会被应用到片段着色器的所有输入属性上。

参考链接:
https://blog.csdn.net/weiyuxinyuan/article/details/84023235
https://www.jianshu.com/p/0f5a625bd179
https://www.cnblogs.com/GarrettWale/p/11335361.html

本文内容整理自网络,目的在于传递更多信息,如涉及侵权,请联系删除。

最新文章