OpenGL 顶点和片元着色器简介

参考:

https://learnopengl-cn.github.io/

https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

https://blog.csdn.net/Zach_z/article/details/80045105

 

     在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。

 

     图形渲染管线接受一组3D坐标,然后把它们转变为你屏幕上的有色2D像素输出。图形渲染管线可以被划分为几个阶段,每个阶段将会把前一个阶段的输出作为输入。所有这些阶段都是高度专门化的(它们都有一个特定的函数),并且很容易并行执行。正是由于它们具有并行执行的特性,当今大多数显卡都有成千上万的小处理核心,它们在GPU上为每一个(渲染管线)阶段运行各自的小程序,从而在图形渲染管线中快速处理你的数据。这些小程序叫做着色器(Shader)。有些着色器允许开发者自己配置,这就允许我们用自己写的着色器来替换默认的。这样我们就可以更细致地控制图形渲染管线中的特定部分了,而且因为它们运行在GPU上,所以它们可以给我们节约宝贵的CPU时间。

     OpenGL着色器是用OpenGL着色器语言(OpenGL Shading Language, GLSL)写成的。GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。编写着色器程序的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。这里不做展开。

 

OpenGL 渲染管线

OpenGL 顶点和片元着色器简介_第1张图片

  • Vertex Data(顶点数据):OpenGL将所有数据保存到缓存对象当中,正如上节当中的glVertexAttribPointer()函数所做的工作,并调用glDrawArrays()函数请求渲染几何图元
  • Vertex Shader(顶点着色器):接受在顶点缓存对象中给出的顶点数据,独立处理每个顶点(对于绘制命令传输的每个顶点,OpenGL都会调用一个顶点着色器来处理顶点的相关数据)。这个阶段是必须的
  • Tessellationj shading stage(细分着色阶段):这个阶段是由Tessellation Control Shader(细分控制着色器)和Tessellation Evaluation Shader(细分赋值着色器)完成的。 这个阶段启用之后,会收到来自顶点着色阶段的输出数据,并对收到的顶点进行进一步的处理,它会在OpenGL管线内部生成新的几何体。这是一个可选阶段
  • Geometry Shader(几何着色器):它会在OpenGL管线内部对所有几何图元进行修改,可以选择输入图元生成更多的几何体,改变几何图元的类型(将三角形转化乘线段之类),或者放弃所有的几何体。这是一个可选阶段
  • Primitive Setup(图元装配):之前着色阶段处理的都是顶点数据,此外,这些顶点构成几何图元的所有信息也会被传递到OpenGL当中。图元装配阶段将这些顶点与相关的几何图元之间组织起来,准备下一步的剪切和光栅化工作
  • Culling and Clipping(裁剪和剪切):顶点可能落在视口之外(即我们能够绘制的窗口区域),此时顶点相关的图元会做出改动,保证相关像素不会绘制在视口以外。由OpenGL自动完成
  • Rasterization(光栅化):光栅化是判断某一部分几何体(点、线或者三角形)所覆盖的屏幕空间。因为屏幕是由一个个的像素点构成的,如果要画一条线,就要判断这条线在哪几个像素点表示,配合下图理解: 

          OpenGL 顶点和片元着色器简介_第2张图片

  • Fragment Shader(片元着色器):最后一个可以通过编程控制编程控制屏幕上显示颜色的阶段叫做片元着色阶段。这个阶段处理OpenGL光栅化之后生成的独立片元,使用着色器计算片元的最终颜色和它的的深度值。这个阶段是必须的

 

在入门阶段,我们只需编写顶点着色器和片元着色器程序。

顶点着色器

在 openGL  编程中顶点着色器是必须的,顶点着色器的功能如下:

  1. 使用模型视图矩阵和投影矩阵进行顶点位置变换
  2. 法线变换,法线工规范化
  3. 纹理坐标生成和变换
  4. 计算每个顶点的光照
  5. 颜色计算

顶点着色器常用变量和属性导图

OpenGL 顶点和片元着色器简介_第3张图片

 

片元着色器

在 openGL  编程中片元着色器是必须的,片元着色器的功能如下:

  1. 为每个像素计算颜色和纹理坐标
  2. 应用纹理
  3. 雾计算
  4. 计算法线(如果你想对每个像素应用光照)

片元着色器常用变量和属性导图

OpenGL 顶点和片元着色器简介_第4张图片

 

用张全局导图结束:

OpenGL 顶点和片元着色器简介_第5张图片

后续学习继续丰富该图,欢迎交流。

 

你可能感兴趣的:(openGLES)