什么是固定管线/存储着⾊器?
在早期的OpenGL版本它封装了很多种着⾊器程序块内置的⼀段包含了光照、坐标变换、裁剪等等诸多功能的固定shader程序,来帮助开发者完成图形的渲染。而开发者只需要传⼊相应的参数就能快速完成图形的渲染。类似于iOS开发会封装很多API,而我们只需要调⽤就可以实现功能,不需要关注底层实现原理。但是由于OpenGL的使⽤场景⾮常丰富,固定管线或存储着⾊器⽆法完成所有业务,这时需要使用可编程管线。
常见的存储着色器:
- 单元着⾊器
参数1:单位着色器
参数2:颜色值
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfoat vColor[4]);
单元着⾊器只是简单地使用默认的笛卡尔坐标系(坐标范围-1.0~1.0)。所有片段都应用同一种颜色,结合图形为实心和未渲染的。这种着色器只使用一个属性 GLT_ATTRIBUTE_VERTEX。vColor参数包含了要求的颜色。
使用场景:绘制默认OpenGL坐标系(-1,1)下图形,图形所有片段都以一种颜色填充(纯色图形)
- 平面着色器
参数1:平面着色器
参数2:允许变化的4*4矩阵
参数3:颜色值
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfoat mvp[16], GLfloat vColor[4]);
平面着色器:它将统一着色器进行了拓展。允许为几何图形变换指定一个 4 * 4 变换矩阵。经常被称为“模型视图投影矩阵”
使用场景: 在绘制图形时,可以应用变换(模型/投影变换).
- 上色着色器
参数1: 存储着色器种类-上色着色器
参数2: 允许变换的4*4矩阵
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
上色着色器:在几何图形中应用的变换矩阵。
需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_COLOR(颜色分量) 2个属性。颜色值将被平滑地插入顶点之间(平滑着色)
使用场景: 在绘制图形时,可以应用变换(模型/投影变换),颜色会平滑的插入到顶点之间,成为平滑着色.
- 默认光源着色器
参数1:默认光源着色器
参数2:模型视图矩阵
参数3:投影矩阵
参数4:颜色值
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
默认光源着色器:这种着色器使对象产生阴影和光照的效果。需要模型视图矩阵、投影矩阵和作为基本色的颜色值等 Uniform 值。所需的属性有 GLT_ATTRIBUTE_VERTEX(顶点分量)和 GLT_ATTRIBUTE_NORMAL(表面法线)。
使用场景: 在绘制图形时,可以应用变换(模型/投影变换).这种着色器使绘制的图形产生阴影和光照的效果.
- 点光源着色器
参数1:点光源着色器
参数2:模型视图矩阵
参数3:投影矩阵
参数4:视点坐标系中的光源位置
参数5:颜色值
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfoat mvMatrix[16], GLfloat pMatrix[16], GLfloat vLightPos[3], GLfloat vColor[4]);
点光源着色器:和默认光源着色器很相似,但光源位置可能是待定的。接受 4 个 Uniform 值,即模型视图矩阵、投影矩阵、视点坐标系中的光源位置和对象的基本漫反射颜色。同样所需的属性有 GLT_ATTRIBUTE_VERTEX(顶点分量)和 GLT_ATTRIBUTE_NORMAL(表面法线)。
使用场景: 在绘制图形时,可以应用变换(模型/投影变换).这种着色器使绘制的图形产生阴影和光照的效果.它与默认光源着色器非常类似,区别在于点光源着色器可以指定光源位置
- 纹理替换矩阵着色器
参数1:纹理替换矩阵着色器
参数2:模型视图矩阵
参数3:纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfoat mvMatrix[16], GLint nTextureUnit);
纹理替换矩阵:着色器通过给定的模型视图投影矩阵,使用绑定到 nTextureUnit(纹理单元) 指定的纹理单元的纹理对几何图形进行变换。片段颜色是从纹理样本中直接获取的。所需的属性有 GLT_ATTRIBUTE_VERTEX(顶点分量)和 GLT_ATTRIBUTE_NORMAL(表面法线)。
使用场景: 在绘制图形时,可以应用变换(模型/投影变换).
这种着色器通过给定的模型视图投影矩阵,使用纹理单元来进行填充,其每个像素点的颜色是从纹理中获取.
- 纹理调整着色器
参数1:纹理调整着色器
参数2:模型视图矩阵
参数3:颜色值
参数4:纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
纹理调整着色器:这种着色器将一个基本色乘以一个取自纹理单元 nTextureUnit 的纹理。所需的属性有 GLT_ATTRIBUTE_VERTEX(顶点分量)和 GLT_ATTRIBUTE_TEXTURE0(纹理坐标)。
使用场景: 在绘制图形时,可以应用变换(模型/投影变换).
这种着色器通过给定的模型视图投影矩阵,着色器将一个基本色乘以一个取自纹理单元nTextureUnit的纹理,将颜色与纹理进行混合后填充到片段中.
- 纹理光源着色器
参数1:纹理光源着色器
参数2:投影矩阵
参数3:视觉空间中的光源位置
参数4:几何图形的基本色
参数5:将要使用的纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
纹理光源着色器:这种着色器将一个纹理通过漫反射照明计算进行调整(相乘),光线在视觉空间中的位置是给定的。这种着色器接受 5 个 Uniform 值,即模型视图矩阵、投影矩阵、视觉空间中的光源位置、几何图形的基本色和将要使用的纹理单元。所需的属性有 GLT_ATTRIBUTE_VERTEX(顶点分量)、GLT_ATTRIBUTE_NORMAL(表面法线)和 GLT_ATTRIBUTE_TEXTURE0(纹理坐标)。
使用场景: 在绘制图形时,可以应用变换(模型/投影变换).
这种着色器通过给定的模型视图投影矩阵,着色器将一个纹理通过漫反射照明计算进行调整(相乘).
OpenGL7种基本图元
- GL_POINTS:每个顶点在屏幕上都是单独点
- GL_LINES:每一对顶点定义⼀个线段
- GL_LINE_STRIP:一个从第一个顶点依次经过每⼀个后续顶点而绘制的线条
- GL_LINE_LOOP:和GL_LINE_STRIP相同,但是最后一个顶点和第一个顶点连接起来了了
- GL_TRIANGLES:每3个顶点定义一个新的三角形
- GL_TRIANGLE_STRIP:共⽤用一个条带(strip)上的顶点的一组三角形
-
GL_TRIANGLE_FAN:以一个圆点为中心呈扇形排列,共用相邻顶点的一组三角形
效果图如下:图元绘制方式
网友评论