OpenGL2-渲染管线

171 阅读4分钟

0201-OpenGL渲染管线

01、OpenGL管线
  • 使用OpenGL技术进行图形编程,最终目的是要将三维图形场景展示在二维的屏幕上。OpenGL和DirectX都使用了管线概念的方案,且在管线中,将三维场景转换成二维图形的过程被分割成许多步骤

    • 之前介绍过,使用C++语言编写的程序,可以调用OpenGL库接口,并最终运行在CPU上。
    • 还需要调用GLSL编写的着色器程序运行在GPU上。

OpenGL图形管线流程
  • OpenGL管线主要阶段包括:顶点着色器 > 图元装配 > 几何着色器 > 曲面细分着色器 > 光栅化 > 片段着色器 > 像素操作

    • 其中顶点着色器,曲面细分着色器,几何着色器和片段着色器可以用GLSL编写,并由C++程序载入运行

1、顶点数据传入GPU

  • C++程序通过顶点数组对象(VAO)和顶点缓冲区对象(VBO)将CPU内的顶点数据传入到GPU中

    • 如果是三维立体图形,还需要通过顶点索引缓冲数据(EBO)告诉OpenGL这些顶点如何组成图形的

2、顶点着色器处理接收到的顶点数据

  • 顶点着色器需要将传入的三维物体坐标投影到像素屏幕坐标,其中主要工作是坐标系的转换、裁剪和映射
    • 其中坐标转换包括:物体坐标系(也叫局部坐标)> 世界坐标系 > 摄像机坐标系 > 屏幕坐标系
    • 顶点着色器程序有一个预定义的gl_Position变量,用于接收最后的像素坐标

3、图元装配

  • 这一步是OpenGL自动完成的,根据用户预先设置的绘制顺序,自动将顶点着色器输出的像素坐标绘制成图元

    • OpenGL只能绘制简单的图元,图元包括点、线和三角形,通过绘制这些图元可以最终渲染出负责的场景
    • 最后绘制成什么样式的图元,由程序调用的绘制方法(drawArrays)的参数决定

4、几何着色器

  • 几何着色器可以让程序员一次操作一个图元的能力,经过上面的图元转配处理后,已经完成了将顶点组合为三角形的过程。

    • 几何着色器可以同时访问每个三角形的所有顶点

5、曲面细分着色器

  • 曲面细分着色器是OpenGL4.0版本加入的功能,可以生成大量三角形的能力,且通常以网格形势排列

6、光栅化

  • 我们要将三维世界中的点、三角形、颜色等最终展示在一个二维的显示器中,这个二维屏幕由栅格(屏幕像素点)组成
    • 操作会将之前处理的图元转化为屏幕上的片段(也可理解为像素),并确定了图元绘制的像素位置
    • 光栅化操作,会对图元的顶点数据进行插值处理

7、片段着色器

  • 片段着色器计算每个片元的最终颜色,决定最终的渲染效果
    • 根据法向量和片元位置(gl_FragCoord),以及自定义的物体材质,光源位置,光照模型等,计算片元的最终颜色并输出

8、测试与混合

  • 这一步由OpenGL自动完成,判断用户是否开启了深度测试,OpenGL会根据深度(片元距离摄像机的距离)计算

    • 摄像机只渲染看得到的片元,如果是被遮挡的物体则不渲染,实现隐藏面消除效果
    • 启动深度测试 glEnable(GL_DEPTH_TEST);
    • 如果有透明效果,需要进行颜色混合处理
  • 总结

  • 图形编程,由C++语言编辑的程序和GLSL语言编写的着色器程序完成,要想将三维图形最终渲染到二维屏幕上,需要经过渲染管线流程

  • 渲染管线核心流程包括:

    • 在程序中使用缓冲区将顶点数据传递给GPU处理
    • 顶点着色器顶点数据进行处理,包括坐标变换,裁剪和投影
    • 图元装配根据顶点数据绘制成基本图元
    • 光栅化操作将装配好的图片转化为屏幕上的片元
    • 接着片元着色器对每个片元计算最终的渲染颜色
    • 开启深度测试,在屏幕上只渲染未遮挡物体,如果有透明效果,需要进行颜色混合处理
    • 曲面着色器和几何着色器使用场景不多,暂不深入