渲染流水线(Render Pipline)
简化流水线:
graph TD;
A[数据]-->B[顶点Shader]-->C[光栅化]-->D[片元着色器]-->E[渲染输出];
- 输入装载。 从提交的buffer中, 根据设置收集顶点数据。
- 顶点着色器。对每个顶点进行处理,通常是执行顶点从模型空间转换到屏幕空间。然后再传递到流水线中。
- 曲面细分着色器。根据某些规则细分网格以提高质量。
- 几何着色器。对每个图元(三角形、线、点)进行处理,丢弃或者输出更多的图元。类似
曲面细分着色器,但更灵活。 - 光栅化阶段。将图元离散为片元。这些是他们在缓冲区中填充的元素。任何屏幕外的片元都将被丢弃,
顶点着色器输出的属性都将被插值到片元中。 - 片元着色器。为
每个幸存的片元执行片元着色器,并确定将片元写入哪些缓冲区以及使用哪些颜色和深度值。它可以使用来自顶点着色器的插值数据来执行此操作,其中可以包括纹理坐标和光照法线等内容。 - 混合阶段(逐像素处理阶段)。
应用
混合操作映射到同一像素的不同片元。片元混合可以是相互覆盖、叠加或者基于透明度的混合。
- 其中输入装载、光栅化、混合阶段称之为
固定功能阶段。这些阶段是预定义的,允许使用选项/参数调整他们的操作。比如:- 输入装载。提交顶点数据进行渲染需要创建一个顶点流,然后告诉Pipline 如何解释该流。(各种顶点buff填充与绑定提交)
- 光栅化。多重采样。
- 混合阶段。
- 像素所有权测试(Pixel ownership test)。如果片段的像素不是 OpenGL“拥有”的(如果另一个窗口与 GL 窗口重叠),则失败。使用Framebuffer Object时总是通过。失败意味着像素包含未定义的值。
- 裁剪测试(Scissor Test):启用后,如果片段的像素位于屏幕的指定矩形之外,则测试失败。
- 模板测试(Stencil Test)::启用后,如果测试提供的模板值没有与用户指定的模板缓冲区中底层样本的模板值进行比较,则测试失败。请注意,即使模板测试失败(即使深度测试失败),仍然可以修改帧缓冲区中的模板值。
- 深度测试(Depth Test):启用后,如果片段的深度没有按照用户指定的与深度缓冲区中基础样本的深度值进行比较,则测试失败。
** 注意:虽然这些被指定在Fragment Shader之后发生,但在某些条件下它们可以在片段着色器之前发生。如果它们发生在 FS 之前,那么片段的任何剔除也会阻止片段着色器执行,从而节省性能。 在此之后执行颜色混合。对于每个片段颜色值,在它与该位置帧缓冲区中已经存在的颜色之间都有一个特定的混合操作。逻辑操作也可以代替混合进行,混合在片段颜色和帧缓冲区颜色之间执行按位操作。 **
最后,将片段数据写入帧缓冲区。屏蔽操作允许用户防止写入某些值。可以打开和关闭颜色、深度和模板书写;单个颜色通道也可以被屏蔽。
https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview#Rasterization