OpenGL渲染架构
2020-07-07 本文已影响0人
iOSer_jia
1.OpenGL渲染架构
![](https://img.haomeiwen.com/i1818006/f6590da1e6911c96.png)
Attribute:只能传入顶点着色器,一般传递会频繁改变的值,比如顶点数据、纹理坐标、光照法线、颜色数据。
Uniforms:可以传入到顶点着色器和片元着色器,一般传递不变的值,比如旋转矩阵、位移矩阵。
Texture Data:纹理数据,可以传递到顶点着色器和片元着色,一般传递到片元着色器。
2.基本图元
![](https://img.haomeiwen.com/i1818006/d07cdaeddb0f3986.png)
图元 | 描述 |
---|---|
GL_POINTS | 每个顶点在屏幕上都是单独 |
GL_LINES | 每一对顶点定义一个线段 |
GL_LINE_STRIP | 一个从第一个顶点依次经过每一个后续顶点而绘制的线条 |
GL_LINE_LOOP | 和GL_LINE_STRIP相同,但是最后一个顶点和第一个顶点连接起来了 |
GL_TRIANGLES | 每3个顶点定义一个新的三角形 |
GL_TRIANGLE_STRIP | 三角形带,共用上一个三角形最后两个顶点 |
GL_TRIANGLE_FAN | 三角形环,以一个圆点为中心呈扇形排列 |
OpenGL最光栅化最喜欢的图形--三角形,我们将三个顶点坐标在坐标轴按照逆时针环绕的称为正三角,反之称为反三角。
在默认情况下,OpenGL 认为具有逆时针⽅方向环绕的多边形为正面.
可以通过glFrontFace(GL_CW)将顺时针方向环绕的多边形改为反面
3.投影
设置正投影
GLFrumstum::SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax);
设置平行投影
// fFov: 垂直方向上的市场角度
// fAspect: 窗口的宽度和高度的纵横比(w/h)
// fNear: 近裁截面的距离
// fFar: 远裁截面的距离
GLFrumstum::SetPerspective(float fFov, float fAspect, float fNear, float fFar);
4.固定着色器
初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders()
单元着色器
一般用于所有片段都以一种颜色填充的情况。
// param1: 固定着色器种类
// param2: 颜色
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
平面着色器
在绘制图形时,可以应用变换。
// param1:固定着色器种类
// param2:允许变化的4*4矩阵
// 颜色
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],,GLfloat vColor[4]);
上色着色器
与平面着色器类似,颜⾊将会平滑地插⼊入到顶点之间,称为平滑着色。
// param1: 固定着色器种类
// parma2: 允许变化的4*4矩阵
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
默认光源着色器
这种着⾊器器会使绘制的图形产⽣阴影和光照的效果。
// param1: 固定着色器种类
// param2: 模型4*4矩阵
// param3: 投影4*4矩阵
// param4: 颜色
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
点光源着色器
这种着色器会使绘制的图形产⽣阴影和光照的效果.它与默认光源着⾊器器非常类似,区别只是光源位置可能是特定的.
// param1: 固定着色器种类
// param2: 模型4*4矩阵
// param3: 投影4*4矩阵
// param4: 点光源位置
// param5: 颜色值
GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
纹理替换矩阵着色器
这种着⾊色器通过给定的模型视图投影矩阵.使⽤纹理单元来进行颜⾊填充.其中每个像素点的颜⾊色是从纹理中 获取.
// param1: 固定着色器种类
// param2: 模型4*4矩阵
// parms3: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);
纹理调整着色器
这种着⾊色器通过给定的模型视图投影矩阵. 着⾊器将⼀个基本⾊乘以一个取自纹理单元nTextureUnit的纹 理.将颜色与纹理进行颜⾊混合后才填充到片段中.
// param1: 固定着色器种类
// param2: 模型4*4矩阵
// param3: 颜⾊色值
// param4: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
纹理光源着色器
这种着⾊器通过给定的模型视图投影矩阵. 着色器将一个纹理通过漫反射照明计算进行调整(相乘).
// param1: 固定着色器种类
// param2: 模型4*4矩阵
// param3: 投影4*4矩阵
// param4: 点光源位置
// param5: 颜色值
// param6: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);