OpenGL渲染架构

1,663 阅读6分钟

OpenGL渲染架构

主要包含两个模块:

  • Client客户端:常见的App代码以及OpenGL相关的调用API代码,该部分通过CPU执行;
  • Server服务端:OpenGL底层的着色器渲染等流程,该部分通过GPU执行。

架构分析

  • 客户端中通过iOS代码调用OpenGL API中的方法,将图形渲染的相关数据通过通道传递到Server中顶点着色器和片元着色器,并交由GPU处理;
  • Server通过与客户端的通道接收传递的数据,并交由相应着色器进行渲染处理,并将最终的结果渲染到屏幕上。

数据传递方式

  • Attributes
  • Uniform
  • Texture Data
通道名称说明可传入的着色器
Attributes经常发生变动的数据 :顶点坐标、纹理坐标、投影矩阵、模型矩阵等顶点着色器
Uniform不经常发生变动的数据顶点着色器/片元着色器
Texture Data纹理数据顶点着色器/片元着色器

Attributes

  • Attributes通道只能将数据直接传递到顶点着色器,不能直接传递到片元着色器,但是可以通过顶点着色器间接传递给片元着色器;
  • 通过Attributes传递的通常是经常发生变化的数据,例如颜色、顶点等;
  • Attribute主要传递这些参数:颜色数据、顶点坐标、纹理坐标、光照法线等。

Uniform

  • Uniform通过既可以传递到顶点着色器,也可以传递到片元着色器;
  • Uniform中传递的通常是比较统一的批次数据,不经常发生变动的数据。

Texture Data

  • Texture Data同Unoform一样,可以将数据传递到顶点和片元着色器;
  • 由于顶点着色器主要是处理顶点数据的,我们将纹理数据传过去并没有多大的意义。而纹理的处理的逻辑主要是在片元着色器中进行的。

OpenGL固定管线下的常见的存储着色器类型以及使用

OpenGL固定管线下的存储着色器都是不可编辑的,只能调用。OpenGL中可编辑的着色器有顶点着色器和片元着色器。

单元着色器

使用方式:
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);

  • 参数1:存储着色器种类-单元着色器;
  • 参数2:颜⾊。 使⽤用场景: 绘制默认OpenGL 坐标系(-1,1)下图形. 图形所有片段都会以⼀一种颜色填充。无法进行缩放、平移等变换。

平面着色器

使用方式:
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);

  • 参数1:存储着色器种类-平面着色器;
  • 参数2:允许变化的4*4矩阵;
  • 参数3:颜⾊。 使⽤用场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)。在单元着色器的基础上可以进行缩放、平移等矩阵变换。

上色着色器

使用方式:
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);

  • 参数1:存储着色器种类-上色着色器;
  • 参数2:允许变化的4*4矩阵; 使⽤用场景: 在绘制图形时, 可以应用变换(模型/投影变化) 颜⾊将会平滑地插入到顶点之间,称为平滑着⾊器。

默认光源着色器

使用方式:
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);

  • 参数1:存储着色器种类-默认光源着色器;
  • 参数2:模型4*4矩阵;
  • 参数3:投影4*4矩阵;
  • 参数4:颜色值。 使⽤用场景: 在绘制图形时, 可以应⽤变换(模型/投影变化),这种着⾊器会使绘制的图形产生阴影和光照的效果。

点光源着色器

使用方式:
GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);

  • 参数1:存储着色器种类-点光源着色器;
  • 参数2:模型4*4矩阵;
  • 参数3:投影4*4矩阵;
  • 参数4:点光源的位置;
  • 参数5:颜色值。 使⽤用场景: 在绘制图形时, 可以应用变换(模型/投影变化),这种着色器会使绘制的图形产生阴影和光照的效果.它与默认光源着色器非常类似,区别只是光源位置可能是特定的。

纹理替换矩阵着色器

使用方式:
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);

  • 参数1:存储着色器种类-纹理替换矩阵着色器;
  • 参数2:模型4*4矩阵;
  • 参数3:纹理单元。 使⽤用场景: 在绘制图形时, 可以应用变换(模型/投影变化),这种着⾊器通过给定的模型视图投影矩阵,使⽤纹理单元来进行颜色填充,其中每个像素点的颜⾊是从纹理中获取。

纹理调整着色器

使用方式:
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);

  • 参数1:存储着色器种类-纹理调整着色器;
  • 参数2:模型4*4矩阵;
  • 参数3:颜色值。
  • 参数3:纹理单元。 使⽤用场景: 在绘制图形时, 可以应⽤变换(模型/投影变化),这种着色器通过给定的模型视图投影矩阵,着⾊器将⼀个基本色乘以一个取⾃纹理单元nTextureUnit 的纹理,将颜色与纹理进行颜色混合后才填充到片段中。也就是将纹理和颜色进行混合显示。

纹理光源着色器

使用方式:
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);

  • 参数1:存储着色器种类-纹理光源着色器;
  • 参数2:模型4*4矩阵;
  • 参数3:投影4*4矩阵;
  • 参数4:点光源位置;
  • 参数5:颜色值(几何图形的基本色);
  • 参数6:纹理单元。 使⽤用场景: 在绘制图形时,可以应⽤变换(模型/投影变化),这种着⾊器通过给定的模型视图矩阵和投影矩阵,着⾊器将一个纹理通过漫反射照明计算进⾏调整(相乘)。

OpenGL基本图元连接方式

常见的图元链接方式:

图元描述速度
GL_POINTS每个顶点在屏幕上都是单独点
GL_LINES每一对顶点定义⼀个线段
GL_LINE_STRIP⼀个从第一个顶点依次经过每⼀个后续顶点⽽绘制的线条
GL_LINE_LOOP和GL_LINE_STRIP相同,但是最后一个顶点和第一个顶点连接起来了.
GL_TRIANGLES每3个顶点定义一个新的三⻆角形
GL_TRIANGLE_STRIP当绘制n顶点时,复用n-1和n-2两个顶点组成三角形
GL_TRIANGLE_FAN当绘制n顶点时,复用0和n-1两个顶点组成三角形

图元链接方式的图形表示:

三角形带和三角形扇

使用GL_TRIANGLE_STRIP(三角形带)和三角形扇(GL_TRIANGLE_FAN)可以绘制一连串相邻的三角形,通过复用顶点,从而避免了重复的顶点。节约了大量的程序代码和数据存储空间,使得程序的速度更快。