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)可以绘制一连串相邻的三角形,通过复用顶点,从而避免了重复的顶点。节约了大量的程序代码和数据存储空间,使得程序的速度更快。