渲染架构
从上图可以看到OpenGL的渲染架构分为2个部分:客户端(Client)和服务端(Server)。
- 客户端(Client)与我们平常开发所说的前端iOS或者android开发不一样,它是指CPU上所存储的代码,我们叫客户端(Client)。比如,我们会用到OpenGL的代码,C代码,C++代码以及OpenGL提供的API等等。
- 服务器(Client)指的是OpenGL的底层代码。
- 顶点着色器(Vertex Shader)是用来处理顶点数据的。
- 图元装配(Primitive Assembly)是一系列操作,图元装配阶段执行的操作包括:将顶点着色器的输出值执行裁剪、透视分割、视口变换后进入光栅化阶段。
- 片元着色器(Vertex Shader),在经过图元装配后,片元着色器(Vertex Shader)会拿到位置和纹理坐标这样的参数。
- 渲染(Render),就是片元着色器(Vertex Shader)处理位置和纹理坐标等参数并绘制到屏幕的过程。
参数传递
从客户端到服务端传输数据有三种通道:Attributes、Uniforms、Texture Data。
- 属性(Attributes)
从图中可以看到属性只能传给顶点着色器,所以如果片元着色器要拿属性的值,只能通过顶点着色器。属性中一般会携带顶点坐标,投影矩阵,模型矩阵,纹理坐标等数据。 - 统一(Uniforms)
是一个统一的批次,一次性把数据传给着色器,Uniforms尽量传不会变的数据。Uniforms可以传给顶点着色器和片元着色器。 - 纹理数据(Texture Data)
纹理数据可以传给顶点着色器和片元着色器。但是纹理数据一般不会传给顶点着色器,因为顶点着色器不会去处理纹理数据。
基本图元
- 点
在OpenGL中,“点”称为顶点(Vertex),通常用一个形如(x, y, z)的三维坐标值表示。 - 线段
- 独立线段:图元类型参数--GL_LINES
- 线段间首尾相连但最终不闭合:折线,图元类型参数--GL_LINE_STRIP
- 线段间首尾相连最终封口闭合:图形,图元类型参数--GL_LINE_LOOP
- 多边形
- 按点的定义顺序依次连接:图元类型参数--GL_POLYGON
- 从第1个点开始,每三个点一组画一个三角形,三角形之间是独立的:图元类型参数--GL_TRIANGLES
- 从第三个点开始,每点与前面的两个点组合画一个三角形,即线性连续三角形串:图元类型参数--GL_TRIANGLE_STRIP
- 从第三个点开始,每点与前一个点和第一个点组合画一个三角形,即扇形连续三角形:图元类型参数--GL_TRIANGLE_FAN
着色器
着色器初始化方式
// GLShaderManager 的初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders()
着色器种类
- 单元着色器
//参数1: 存储着⾊器种类-单元着⾊器
//参数2: 颜⾊
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
使⽤场景: 绘制默认OpenGL 坐标系(-1,1)下图形. 图形所有⽚段都会以⼀种颜⾊填充。
- 平⾯着⾊器
//参数1: 存储着⾊器种类-平⾯着⾊器
//参数2: 允许变化的4*4矩阵
//参数3: 颜⾊
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)。
- 上⾊着⾊器
//参数1: 存储着⾊器种类-上⾊着⾊器
//参数2: 允许变化的4*4矩阵
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 颜⾊将会平滑地插⼊到顶点之间称为平滑着⾊。
- 默认光源着⾊器
//参数1: 存储着⾊器种类-默认光源着⾊器
//参数2: 模型4*4矩阵
//参数3: 投影4*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: 点光源的位置
//参数5: 颜⾊值
GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣阴影和光照的效果,它与默认光源着⾊器⾮常类似,区别只是光源位置可能是特定的。
- 纹理替换矩阵着⾊器
//参数1: 存储着⾊器种类-纹理替换矩阵着⾊器
//参数2: 模型4*4矩阵
//参数3: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵。使⽤纹理单元来进⾏颜⾊填充.其中每个像素点的颜⾊是从纹理中获取。
- 纹理调整着⾊器
//参数1: 存储着⾊器种类-纹理调整着⾊器
//参数2: 模型4*4矩阵
//参数3: 颜⾊值
//参数4: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将⼀个基本⾊乘以⼀个取⾃纹理单元nTextureUnit 的纹理。将颜⾊与纹理进⾏颜⾊混合后才填充到⽚段中。
- 纹理光源着⾊器
//参数1: 存储着⾊器种类-纹理光源着⾊器
//参数2: 模型4*4矩阵
//参数3: 投影4*4矩阵
//参数4: 点光源位置
//参数5: 颜⾊值(⼏何图形的基本⾊)
//参数6: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat
vBaseColor[4],GLint nTextureUnit);
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模 型视图投影矩阵. 着⾊器将⼀个纹理通过漫反射照明计算进⾏调整(相乘).