OpenGL入门学习笔记(三)----图形渲染管道的基本流程

参考网站https://antongerdelan.net/opengl/vertexbuffers.html

LearnOpenGL - Hello Triangle

        在OpenGL当中,我们通过2D屏幕像素组来渲染3D空间中的事物,这个很多工作是把3D空间坐标转换为适应屏幕的2D像素,这个过程是由OpenGL的图形渲染管线(Graphics Pipeline管理的,这个更多的指的是一个转换的过程。主要被划分为两部分:第一部分是把3D坐标转化为2D坐标,第二部分是把这些坐标转换为屏幕上的像素。

渲染流程概述

        图形渲染管线大体被分为几个流程,其中每个部分都采用前一部分的输出作为输入,每个部分都有专门的函数执行,很容易并行执行,所以当今的GPU实际上很多都是由成千上万的小处理核心组成,他们各自运行各阶段的小程序,这些被运行的小程序就叫做着色器(shader)。OpenGL就是用的OpenGL shadering Language(GLSL)写的着色器。

        接下来概括地介绍图形渲染管线的各个部分,其中蓝色为我们可以人为编写操控的部分。

        以三角形为例,首先我们先接受一组表示顶点坐标的数据以数组的方式作为图形渲染管线的输入。这个数组叫做顶点数据。顶点数据使用顶点属性表示的,实际上,顶点属性不单单是可以表示空间坐标的位置属性,也可以是其他任意表示顶点属性的数据(比如颜色等等)。这里简单起见,我们姑且传入表示顶点位置属性的顶点数据作为这个图形渲染管线的输入。

        图形渲染管线的第一部分叫做顶点着色器(vertex shader);他把单独的顶点的一组数据进行处理,顶点着色器主要的目的是把3D坐标转为另一种3D坐标(后面会解释),同时顶点着色器允许我们对顶点属性进行一些基本处理。

        图元装配(Primitive Assembly)将处理过的顶点作为输入,将这些顶点组装为指定图元形状,在这里指定为GL_TRIANGLE,所以这个阶段将这三个点组装成一个三角形。

        紧接着进入几何着色器(Geometry Shader),接受图元形式的顶点,并可以通过产生新顶点生成新的其他形状。

        接下来是光栅化(Rasterization Stage)阶段,这个阶段会将图元映射为像素,但是在呈现在屏幕之前,会进行裁剪,将视图以外的像素(比如前后遮挡)删除,以提升执行效率,并最终生成供片段着色器使用的片段。

       片段着色器(fragment shader)阶段将输入进行计算最终映射为呈现在屏幕上的像素的最终的颜色。

在所有对应颜色值确定以后,最终的对象将会被传到最后一个阶段,我们叫做Alpha测试和混合(Blending)阶段。这个阶段检测片段的对应的深度(和模板(Stencil))值(后面会讲),用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)。

        在目前大多数情况,我们只需要定义顶点着色器和片段着色器,且在OpenGL当中至少要定义一个片段着色器和顶点着色器。

VBO,VAO和VEO

        对于输入的顶点数据,OpenGL会先把他归一化为范围-1--1的标准化设备坐标才能进行处理,和定义屏幕大小左上角不同,这次是从正中心开始作为原点。一旦顶点数据经过顶点着色器处理,那么他就是一个标准化设备坐标,接着会根据屏幕大小映射为对应的屏幕空间的坐标。

        在有了这些顶点坐标数据后,我们会先发送给GPU开始图形渲染管线,在它的第一个阶段:顶带你着色器,它会在GPU上建立储存顶点数据的内存,并告诉OpenGL如何解释它,并如何发送至GPU使用。

        我们通过VBO(vertex buffer object,顶点缓冲对象)来进行这个内存的管理。然后利用这个我们可以一次性发送储存大量顶点数据,提升了CPU GPU之间的效率。从CPU把数据发送到显卡相对较慢,所以只要可能我们都要尝试尽量一次性发送尽可能多的数据。当数据发送至显卡的内存中后,顶点着色器几乎能立即访问顶点,这是个非常快的过程。

        OpenGL的缓冲类型有很多种,顶点缓冲对象是其中一个,需要知道的是,对于顶点缓冲对象可以同时存在多个,但是一个缓冲类型同时只能绑定一个对象,并且使用的一定是最近绑定的缓冲对象,为了区分不同的对象,我们可以通过GLuint来创建不同的标识符来标识不同的缓冲对象,并进一步创建具体的对象与标识符绑定,最后当我们要对这个对象进行操作时,将对象对应的标识符绑定到对应缓冲类型即可。

        这样来回切换显得很麻烦,于是OpenGL为我们提供了一种模板化的方式,通过VAO(vertex array object 顶点数组对象)来实现,它不是OpenGL的一种缓冲对象,而属于一种封装了顶点数据处理的对象,主要是用来VBO和VEO的启用以及状态。可以理解为一个模板,先创建了这个对象后,我们将数据的引用和处理提前设置好再进行保存,这样当我们调用这个对象后,就可以更流畅的的执行我们预先设计的行为。设置结束后一定要注意解除。

        最后是关于VIO&VEO(vertex indices/elements object,顶点索引对象)。设想我们要渲染的网格有很多三角形组成,相邻的三角形之间互相接触的边会有重合的顶点,当我们的网格足够大时,这个重复的数字是庞大的,这严重影响了运行效率,VEO就是为了避免这种重复而出现的。我们把互不相同的顶点放进VBO,这样减少了重复顶点数据的处理,而将这些顶点的绘制顺序另外储存,虽然顶点绘制个数不变,但是大大减少了对于顶点数据量的处理,提高了效率。

        对于具体的代码,打算在下一篇笔记专门记录,并运用本篇相关概念,绘制矩形。

        

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值