OpenGL(三) OpenGL渲染架构

一、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);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。