开场白
本文介绍内容
- OpenGL渲染架构流程
- OpenGL固定着色器
- OpenGL基本图元连接方式
OpenGL渲染简化流程
渲染流畅大致分为两部分:客户端和服务端
- 客户端:主要是应用程序的相关代码以及OpenGL API的调用,工作硬件是CPU。将渲染的命令和数据组合起来发送给服务端。
-
服务端:拿到客户端发来的数据,进行服务端的渲染流程,工作硬件是GPU。
服务端的流程:
顶点着色器->图元组合->片元着色器->渲染
从客户端传递过来的数据有三种类型:
- Texture:纹理数据,此数据不仅可以传递给顶点着色器,也可以直接传递给片元着色器。通常有顶点数据(x,y,z,w)、矩阵数据或者纹理坐标等等。
- Uniform:不可变的数据,可以传递给顶点着色器和片元着色器。
- Attribute:属性,只能传递给顶点着色器。
OpenGL固定着色器
初始化&调用
初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();
调用时提供了统一的API函数。函数参数不固定,根据第一个参数的枚举值来确定使用哪个固定着色器,并且确定函数的参数个数。
GLint UseStockShader(GLT_STOCK_SHADER nShaderID, ...);
单元着色器
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4])
- 参数1:单元着色器
- 参数2:颜色数组
使用场景:绘制默认OpenGL坐标系(-1,1)下的图形。图形所有片段都会以指定的颜色填充。
平面着色器
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfloat mvp[16], GLfloat vColor[4])
- 参数1:平面着色器
- 参数2:4*4变化矩阵
- 参数3:颜色数组
使用场景:绘制矩阵图形,利用矩阵特性,应用变换(模型变化、投影变化)。
上色着色器
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16])
- 参数1:上色着色器
- 参数2:4*4变化矩阵
使用场景:绘制矩阵图形,利用矩阵特性,应用变换(模型变化、投影变化)。颜色将会平滑地插入到顶点之间平滑着色。
默认光源着色器
GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4])
- 参数1:默认光源着色器
- 参数2:模型4*4矩阵
- 参数3:投影4*4矩阵
- 参数4:颜色值
使用场景:绘制矩阵图形,利用矩阵特性,应用变换(模型变化、投影变化)。默认光源着色器会使绘制的图形产生阴影和光照的效果。
点光源着色器
GLShaderManager::UseStockShader(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::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLint nTextureUnit)
- 参数1:纹理替换矩阵着色器
- 参数2:模型4*4矩阵
- 参数3:纹理单元
使用场景:绘制矩阵图形,利用矩阵特性,应用变换(模型变化、投影变化)。这种着色器通过给定的模型视图投影矩阵。使用纹理单元来惊醒颜色填充。其中每个像素点的颜色是从纹理中获取。
纹理调整着色器
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvMatrix[16], GLfloat vColor[4], GLint nTextureUnit)
- 参数1:纹理调整着色器
- 参数2:模型4*4矩阵
- 参数3:颜色值
- 参数4:纹理单元
使用场景:绘制矩阵图形,利用矩阵特性,应用变换(模型变化、投影变化)。这种着色器通过给定的模型视图投影矩阵。着色器将一个基本色乘以一个取自纹理单元nTextureUnit的纹理。将颜色与纹理进行颜色混合后才填充到片段中。
纹理光源着色器
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF, GLfloat 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_LINES:每一对顶点连接成一条线图元。
- GL_LINE_STRIP:线图元带,前两个顶点连接成线后,复用前一个顶点与新顶点组成新的线,重复下去,组成线图元带。
- GL_LINE_LOOP:在线图元带基础上,增加结束点的首位相连。
- GL_POLYGON:多边形图元。
- GL_QUADS:四边形图元。
- GL_QUADS_STRIP:四边形图元带,复用前一个四边形的后两个顶点与新的两个顶点组成新的四边形图元。
- GL_TRIANGLES:三角形图元。
- GL_TRIANGLE_STRIP:三角形图元带,复用前一个三角形的后两个顶点与新的一个顶点组成新的三角形图元。
- GL_TRIANGLE_FAN:三角形图元扇,复用所有顶点的第一个顶点和前一个三角形的最后一个顶点,与新的顶点组成新的三角形图元。
注意:默认情况,OpenGL以逆时针为正,顺时针为反。
图中左边的三角形是正面三角形,右边的是反面三角形。