1、OpenGL的渲染架构
OpenGL渲染管线简化流程图
1、 客户端-服务器
管线上半部分是客户端,下半部分是服务器。就 OpenGL 而言,客户端是存储在 CPU 存储器中的,驱动程序将渲染命令与数据组合起来发给服务器执行。
服务器和客户端在功能上是异步的。客户端不断的将数据和命令组合在一起送入缓冲区,缓冲区再发送到服务器执行。
2、渲染流程
1、设置顶点数据和其他参数。
2、在顶点着色器中进行运算得到裁剪坐标
3、细分着色器、几何着色器,不可自定义,跳过
4、图元组合,根据设置构建的点、线三角形。
5、裁剪,裁剪掉超出显示区域的部分
6、光栅化,将图源栅格化为一个个的像素点。
7、片元着色器,将对应的栅格(像素)填充为具体的颜色(纹理)。
8、渲染所得图形。
3、着色器传递渲染数据的方法
attrubutes(属性): 一般attribute变量储存一些顶点数据,如:顶点坐标、法线、纹理坐标、顶点颜色等,attribute变量只能在顶点着色器(vertex shader)中使用
uniforms(统一变量):是一个常量值,储存各种着色器需要的数据,例如:转换矩阵、光照参数或者颜色。
-
Textures(纹理):
纹理是图片,图片也是纹理。在游戏中所看到的人物模型、树木模型,都是有纹理贴图的。它像一张贴纸一样贴在模型表面。
纹理可以被顶点着色器(vertex shader)和片段着色器(fragment shader)使用。
使用纹理坐标获取纹理颜色叫采样
纹理的四种环绕方式
GL_REPEAT 重复纹理图像
GL_MIRRORED_REPEAT 和GL_REPEAT一样,每次图形是镜像放置的.
GL_CLAMP_TO_EDGE 纹理坐标会被约束在0-1之前,超出的部份会重复纹理坐标的边缘,产生一种边缘被拉伸的效果
GL_CLAMP_TO_BORDER 超出的坐标为用户指定的边缘颜色。
2、图元
点|GL_POINTS
线 |GL_LINES
条带线 |GL_LINE_STRIP
循环线 |GL_LINE_LOOP
独立三角形 |GL_TRIANGLES
三角形条带 |GL_TRIANGLE_STRIP
三角形扇面 |GL_TRIANGLE_FAN
元图类型 | OpenGL枚举量 |
---|---|
点 | GL_POINTS |
线 | GL_LINES |
条带线 | GL_LINE_STRIP |
循环线 | GL_LINE_LOOP |
独立三角形 | GL_TRIANGLES |
三角形带条 | GL_TRIANGLE_STRIP |
三角形扇面 | GL_TRIANGLE_FAN |
简单介绍使⽤GLBatch 帮助类绘制几何图形的接口调用
//定义一些图形顶点
GLfloat vPyramid[] = {
-2.0f, 0.0f, -2.0f,
2.0f, 0.0f, -2.0f,
0.0f, 4.0f, 0.0f,
2.0f, 0.0f, -2.0f,
2.0f, 0.0f, 2.0f,
0.0f, 4.0f, 0.0f,
2.0f, 0.0f, 2.0f,
-2.0f, 0.0f, 2.0f,
0.0f, 4.0f, 0.0f,
-2.0f, 0.0f, 2.0f,
-2.0f, 0.0f, -2.0f,
0.0f, 4.0f, 0.0f
};
//
//批次处理
triangleBatch.Begin(GL_TRIANGLES,12);
triangleBatch.CopyVertexData3f(vPyramid);
triangleBatch.End();
//开始绘制
triangleBatch.Draw();
3、着色器
1、单元着色器(GLT_SHADER_IDENTITY)
参数1: 存储着⾊器种类-单元着⾊器
参数2: 颜⾊值
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,
GLfloat vColor[4]);
使⽤场景:绘制默认OpenGL 坐标系(-1,1)下图形。 图形所有片段都会以⼀种颜⾊填充。
2、平面着色器(GLT_SHADER_FLAT)
参数1: 存储着⾊器种类-平⾯着⾊器
参数2: 允许变化的4*4矩阵
参数3: 颜⾊色值
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,
GLfloat mvp[16],
GLfloat vColor[4]);
使⽤场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。
3、上色着色器(GLT_SHADER_SHADED)
参数1: 存储着⾊器种类-上⾊着⾊器
参数2: 允许变化的4*4矩阵
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,
GLfloat mvp[16]);
使⽤场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。颜色将会平滑地插入到顶点之间,称为平滑着色。
4、默认光源着色器(GLT_SHADER_DEFAULT_LIGHT)
参数1: 存储着⾊器种类-默认光源着⾊器
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 颜⾊值
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,
GLfloat mvMatrix[16],
GLfloat pMatrix[16],
GLfloat vColor[4]);
使⽤场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。这种着⾊器会使绘制的图形产生阴影和光照的效果。
5、点光源着色器(GLT_SHADER_POINT_LIGHT_DIEF)
参数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]);
使⽤场景:在绘制图形时, 可以应用变换(模型/投影变化)。这种着⾊器会使绘制的图形产⽣阴影和光照的效果。它与默认光源着⾊器⾮常类似,区别只是光源位置可能是特定的。
6、纹理替换矩阵着色器(GLT_SHADER_TEXTURE_REPLACE)
参数1: 存储着⾊器种类-纹理替换矩阵着⾊器
参数2: 模型4*4矩阵
参数3: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,
GLfloat mvMatrix[16],
GLint nTextureUnit);
使⽤场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。这种着⾊器通过给定的模型视图投影矩阵,使⽤纹理单元来进⾏颜⾊填充。其中每个像素点的颜⾊是从纹理中获取。
7、纹理调整着色器(GLT_SHADER_TEXTURE_MODULATE)
参数1: 存储着⾊器种类-纹理调整着⾊器
参数2: 模型4*4矩阵
参数3: 颜⾊值
参数4: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,
GLfloat mvMatrix[16],
GLfloat vColor[4],
GLint nTextureUnit);
使⽤场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。这种着⾊器通过给定的模型视图投影矩阵。着⾊器将⼀个基本⾊乘以⼀个取⾃纹理单元nTextureUnit 的纹理,将颜⾊与纹理进⾏颜⾊混合后才填充到⽚段中。
8、纹理光源着色器(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF)
参数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);
使⽤用场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。这种着⾊器通过给定的模型视图投影矩阵,着⾊器将⼀个纹理通过漫反射照明计算进⾏调整(相乘)。