ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OpenGL 渲染管线

2019-06-30 20:53:03  阅读:282  来源: 互联网

标签:渲染 OpenGL 像素 着色 片元 顶点 着色器 管线


OpenGL 渲染管线

渲染管线(rendering pipeline),它是一系列数据处理 过程,并且将应用程序的数据转换到最终渲染的图像。

OpenGL管线.png

OpenGL 首先接收用户提供的几何数据(顶点和几何图元),并且将它输入到一系列 着色器阶段中进行处理,包括:顶点着色、细分着色(细分控制着色器和细分计算着色器),以及最后的几何着色,然后它将被送入光栅化单元(rasterizer)。光栅化单元负责对所有剪切区域(clipping region)内的图元生成片元数据,然后对每个生成的片元都执行一个片元着色器。

1)准备向 OpenGL 传输数据

OpenGL 需要将所有的数据都保存到缓存对象(buffer object)中,它相当于由 OpenGL 服务端维护的一块内存区域。

2)将数据传输到 OpenGL

OpenGL 的绘制通常就是将顶点数据传输到 OpenGL 服务端。我们可以将一个顶点视为 一个需要统一处理的数据包。这个包中的数据可以是我们需要的任何数据。

3)顶点着色

对于绘制命令传输的每个顶点,OpenGL 都会调用一个顶点着色器来处理顶点相关的数据。一个复杂的应用程序可能包含许多个顶点着色器,但是在同一时刻只能有 一个顶点着色器起作用。

4)细分着色

细分着色器会使用 Patch 来描述一个物体的形状,并且使用相对简单的 Patch 几何体连接来完成细分的工作, 其结果是几何图元的数量增加,并且模型的外观会变得更为平顺。

5)几何着色

允许在光栅化之前对每个几何图元做更进一步的处理,
例如创建新的图元。这个着色阶段也是可选的

6)图元装配

图元装配阶段将这些顶点与相关的几何图元之间组 织起来,准备下一步的剪切和光栅化工作。

7)剪切

顶点可能会落在视口(viewport)之外— 也就是我们可以进行绘制的窗口区域— 此 时与顶点相关的图元会做出改动,以保证相关的像素不会在视口外绘制。这一过程叫做剪切(clipping),它是由 OpenGL 自动完成的。

8)光栅化

剪切之后将更新后的图元传递到光栅化单元,生成对应的片元。我们可以将一个片元视为一个“候选的像素”,也就是可以放置在帧缓存中的像素,但是它也可能被最终剔除,不再更新对应的像素位置。之后的两个阶段将会执行片元的处理, 即片元着色和逐片元的操作。

9)片元着色

通过编程控制屏幕上显示颜色的阶段,叫做片元着色阶段。如果我们觉得不应该继续绘制某个片元, 在片元着色器中还可以终止这个片元的处理,这一步叫做片元的丢弃(discard)。

10)逐片元的操作

片元操作的下一步就是最后的独立片元处理过程。在这个阶段里会使用深度测试(depth test,或者通常也称作 z-buffering)和模板测试
(stencil test)的方式来决定一个片元是否是可见的。 如果一个片元成功地通过了所有激活的测试,那么它就可以被直接绘制到帧缓存中了,
它对应的像素的颜色值(也可能包括深度值)会被更新,如果开启了融合(blending)模式,那么片元的颜色会与该像素当前的颜色相叠加,形成一个新的颜色值并写入帧缓存中。

简单记忆:顶点着色(包括细分和几何着色)决定了一个图元应该位于屏幕的什么位置,而片元着色使用这些信息来决定某个片元的颜色应该是什么。

标签:渲染,OpenGL,像素,着色,片元,顶点,着色器,管线
来源: https://blog.csdn.net/weixin_43864837/article/details/94356318

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有