一、OpenGL渲染流程
image.png渲染流程
- 设置顶点数据和其他参数。
- 在顶点着色器中进行运算得到裁剪坐标。
- 细分着色器、几何着色器,这两个不可自定义,跳过。
- 图元设置,根据设置构成点、线、三角形。
- 裁剪,裁剪掉超出显示区域的部分。
- 光栅化, 将图源栅格化为一个个的像素点。
- 片元着色器,将对应的栅格(像素)填充为具体的颜色。
- 渲染图像
二、OpenGL渲染架构
图片来源于网络Attributes
Attributes
属性只能传入顶点着色器,不能直接传递到片元着色器,只能通过GLSL
代码间接传递
- 顶点数据
- 纹理坐标
- 光照法线
- 颜色数据
Uniforms
Uniforms
是一个比较统一的,不会经常发生改变,比如旋转矩阵,这个时候就可以通过Uniform
值传进来,可以直接传到顶点着色器
和片元着色器中
投影
投影
分为正投影(Orthographic Projection)
、透视投影(Perspective Projection)
。
正投影(Orthographic Projection)
物体在屏幕上的大小和实际大小相同,不管是远还是近。如果指定了视景体之外的图形将会被裁剪,可以通过GLFrustum方法完成上述工作。
image.png
图片来源于网络
透视投影
远处的物体看上去比近处的物体更小一些,在模拟和3D动画中,这种投影能够获得最大程度的逼真感。
// fFov:垂直⽅方向上的视场⻆角度
// fAspect:窗⼝口的宽度与⾼高度的纵横⽐比(纵横⽐比 = 宽(w)/⾼高(h))
// fNear:近裁剪⾯面距离
// fFar:远裁剪⾯面距离
CLFrustum::SetPerspective(float fFov , float fAspect ,float fNear ,float fFar);
图片来源于网络
固定存储着色器
初始化
// GLShaderManager 的初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();
单元着色器
单位着色器:只是简单地使用默认笛卡尔坐标系(范围-1.0~1.0)。所有的片段都应用同一种颜色,几何图形为实心和未渲染的。
参数1:存储着色器种类 - 单元着色器
参数2:颜色
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
平面着色器
平面着色器:将统一着色器进行了扩展,允许为几何图形变换指定一个4x4变换矩阵。在绘制时,可以应用变换(模型/投影变化)。
参数1:存储着色器种类 - 平面着色器
参数2:允许变化的4x4矩阵
参数3:颜色
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, FLfloat mvp[16], GLfloat vColor[4]);
上色着色器
上色着色器:这种着色器唯一的uniform值就是在几何图形种应用的变换矩阵。GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_COLOR(颜色分量)在这种着色器中都会使用。颜色值将被平滑地插入顶点之间(称为平滑着色)。
参数1:存储着色器种类 - 上色着色器
参数2:允许变化的4x4矩阵
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
默认光源着色器
默认光源着色器:使对象产生阴影和光照的效果。需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_NORMAL(表面法线)。
参数1:存储着色器种类 - 默认光源着色器
参数2:模型4x4矩阵
参数3:投影4x4矩阵
参数4:颜色
GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT, FLfloat mvMatrix[16],GLfloat pMatrix[16], GLfloat vColor[4]);
点光源着色器
点光源着色器:点光源着色器和默认光源着色器很相似,但是光源位置可能是特定的。同样需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_NORMAL(表面法线)。
参数1:存储着色器种类 - 点光源着色器
参数2:模型4x4矩阵
参数3:投影4x4矩阵
参数4:点光源的位置
参数5:颜色
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, FLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);
纹理替换着色器
纹理替换矩阵着色器:通过给定的模型视图投影矩阵,使绑定到nTextureUnit指定的纹理单元的纹理对几何图形进行变换。片段颜色时直接从纹理样本中直接获取的。所需的属性有GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_NORMAL(表面法线)。
参数1:存储着色器种类 - 纹理替换矩阵着色器
参数2:模型4x4矩阵
参数3:纹理单元。
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);
纹理调整着色器
纹理调整着色器:将一个基本色乘以一个取自纹理单元nTextureUnit的纹理。所需的属性有GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_TEXTURE0(纹理坐标)。
参数1:存储着色器种类 - 纹理调整着色器
参数2:模型4x4矩阵
参数3:颜色值
参数4:纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);
纹理光源着色器
纹理光源着色器:将一个纹理通过漫反射照明计算进行调整(相乘),广西在视觉空间中的位置是给定的,这种着色器接受5个Uniform值,即模型视图矩阵、投影矩阵、视觉空间中的光源位置、几何图形的基本色和将要使用的纹理单元。
所需的属性有GLT_ATTRIBUTE_VERTEX(顶点分量)、GLT_ATTRIBUTE_TEXTURE0(纹理坐标)和GLT_ATTRIBUTE_NORMAL(表面法线)。
参数1:存储着色器种类 - 纹理光源着色器
参数2:模型4x4矩阵
参数3:投影4x4矩阵
参数4:点光源位置
参数5:颜色值(几何图形的基本色)
参数6:纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, GLfloat mvMatrix, GLfloat pMatrix[16], GLfloat vLightPos[3], GLfloat vBaseColor[4], GLint nTextureUnit);
网友评论