OpenGL渲染架构解析

OpenGL渲染架构图.png

渲染架构

从上图可以看到OpenGL的渲染架构分为2个部分:客户端(Client)服务端(Server)

  • 客户端(Client)与我们平常开发所说的前端iOS或者android开发不一样,它是指CPU上所存储的代码,我们叫客户端(Client)。比如,我们会用到OpenGL的代码,C代码,C++代码以及OpenGL提供的API等等。
  • 服务器(Client)指的是OpenGL的底层代码。
    • 顶点着色器(Vertex Shader)是用来处理顶点数据的。
    • 图元装配(Primitive Assembly)是一系列操作,图元装配阶段执行的操作包括:将顶点着色器的输出值执行裁剪、透视分割、视口变换后进入光栅化阶段。
    • 片元着色器(Vertex Shader),在经过图元装配后,片元着色器(Vertex Shader)会拿到位置纹理坐标这样的参数。
    • 渲染(Render),就是片元着色器(Vertex Shader)处理位置纹理坐标等参数并绘制到屏幕的过程。

参数传递

从客户端到服务端传输数据有三种通道:AttributesUniformsTexture Data

  • 属性(Attributes)
    从图中可以看到属性只能传给顶点着色器,所以如果片元着色器要拿属性的值,只能通过顶点着色器。属性中一般会携带顶点坐标,投影矩阵,模型矩阵,纹理坐标等数据。
  • 统一(Uniforms)
    是一个统一的批次,一次性把数据传给着色器,Uniforms尽量传不会变的数据。Uniforms可以传给顶点着色器和片元着色器。
  • 纹理数据(Texture Data)
    纹理数据可以传给顶点着色器和片元着色器。但是纹理数据一般不会传给顶点着色器,因为顶点着色器不会去处理纹理数据。

基本图元


  • 在OpenGL中,“点”称为顶点(Vertex),通常用一个形如(x, y, z)的三维坐标值表示。
  • 线段
    线段.png
    • 独立线段:图元类型参数--GL_LINES
    • 线段间首尾相连但最终不闭合:折线,图元类型参数--GL_LINE_STRIP
    • 线段间首尾相连最终封口闭合:图形,图元类型参数--GL_LINE_LOOP
  • 多边形
    多边形.jpg
    • 按点的定义顺序依次连接:图元类型参数--GL_POLYGON
    • 从第1个点开始,每三个点一组画一个三角形,三角形之间是独立的:图元类型参数--GL_TRIANGLES
    • 从第三个点开始,每点与前面的两个点组合画一个三角形,即线性连续三角形串:图元类型参数--GL_TRIANGLE_STRIP
    • 从第三个点开始,每点与前一个点和第一个点组合画一个三角形,即扇形连续三角形:图元类型参数--GL_TRIANGLE_FAN

着色器

着色器初始化方式

// GLShaderManager 的初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders()

着色器种类

  • 单元着色器
//参数1: 存储着⾊器种类-单元着⾊器
//参数2: 颜⾊
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);

使⽤场景: 绘制默认OpenGL 坐标系(-1,1)下图形. 图形所有⽚段都会以⼀种颜⾊填充。

  • 平⾯着⾊器
//参数1: 存储着⾊器种类-平⾯着⾊器
//参数2: 允许变化的4*4矩阵
//参数3: 颜⾊
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)。

  • 上⾊着⾊器
//参数1: 存储着⾊器种类-上⾊着⾊器
//参数2: 允许变化的4*4矩阵
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 颜⾊将会平滑地插⼊到顶点之间称为平滑着⾊。

  • 默认光源着⾊器
//参数1: 存储着⾊器种类-默认光源着⾊器
//参数2: 模型4*4矩阵
//参数3: 投影4*4矩阵
//参数4: 颜⾊值
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat 
mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣阴影和光照的效果。

  • 点光源着⾊器
//参数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]);

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣阴影和光照的效果,它与默认光源着⾊器⾮常类似,区别只是光源位置可能是特定的。

  • 纹理替换矩阵着⾊器
//参数1: 存储着⾊器种类-纹理替换矩阵着⾊器
//参数2: 模型4*4矩阵
//参数3: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵。使⽤纹理单元来进⾏颜⾊填充.其中每个像素点的颜⾊是从纹理中获取。

  • 纹理调整着⾊器
//参数1: 存储着⾊器种类-纹理调整着⾊器
//参数2: 模型4*4矩阵
//参数3: 颜⾊值
//参数4: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将⼀个基本⾊乘以⼀个取⾃纹理单元nTextureUnit 的纹理。将颜⾊与纹理进⾏颜⾊混合后才填充到⽚段中。

  • 纹理光源着⾊器
//参数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);

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模 型视图投影矩阵. 着⾊器将⼀个纹理通过漫反射照明计算进⾏调整(相乘).

你可能感兴趣的:(OpenGL渲染架构解析)