美文网首页
三、OpenGL渲染架构

三、OpenGL渲染架构

作者: Mjs | 来源:发表于2020-10-28 11:43 被阅读0次

    1.OpenGL渲染的架构

    OpenGL渲染的架构
    渲染流程
    1. 设置顶点数据和其他参数。
    2. 在顶点着色器中进行运算得到裁剪坐标。
    3. 细分着色器、集合着色器,不可自定义,跳过。
    4. 图元设置,根据设置构成点、线、三角形。
    5. 裁剪,裁减掉超出显示区域的部分。
    6. 光栅化,将图元栅格化一个个的像素点。
    7. 片元着色器,将对应的栅格(像素)填充为具体的颜色。
    8. 渲染图像。

    2.参数类型

    • attrubutes属性只能传入顶点着色器,不能直接传入到片元着色器,只能通过GLSL代码间接传递。
      • 顶点数据
      • 纹理坐标
      • 光照法线
      • 颜色数据
    • uniforms值可以传入顶点着色器、片元着色器。

    3.参数的使用

    顶点着色器

    我们可以通过attrubutes获取顶点数据,通过uniforms获取mvp矩阵,在进行运算得到最终的顶点坐标。

    gl_Position = M_pro * M_view * M_model * V_local
    
    片元着色器

    比如在处理视频帧时,一般回事呀YUV格式。要渲染到屏幕上需要将YUV格式转换为RGB格式。在片元着色器中,通过YUV数据进行矩阵运算就可以得到具体的RGB颜色值了。Alpha通道直接赋值为1.0。

    RGB = YUV * 转换矩阵
    
    纹理

    像素数据。片元着色器中,可以通过纹理坐标获取到对应的颜色值进行处理,就可以得到“滤镜”效果。

    3.基本图元

    基本图元
    图元 描述
    GL_POINTS 每个顶点在屏幕上都是单独点
    GL_LINES 每⼀对顶点定义⼀个线段
    GL_LINE_STRIP 一个从第⼀个顶点依次经过每⼀个后续顶点而绘制的线条
    GL_LINE_LOOP 和GL_LINE_STRIP相同,但是最后⼀个顶点和第⼀个顶点连接起来了
    GL_TRIANGLES 每3个顶点定义⼀个新的三角形
    GL_TRIANGLE_STRIP 共⽤一个条带(strip)上的顶点的一组三⻆形
    GL_TRIANGLE_FAN 以⼀个圆点为中⼼呈扇形排列,共⽤相邻顶点的⼀组三⻆形

    GL_TRIANGLE_STRIP优点:

    • 用前3个顶点指定第1个三角形之后,接下来的每⼀个三⻆形,只需要再指定1个顶点。需要绘制⼤量的三⻆形时,采⽤这种⽅法可以节省⼤大量的程序代码和数据存储空间。
    • 提供运算性能和节省带宽。更少的顶点意味着数据从内存传输到图形卡的速度更快,并且顶点着⾊器需要处理的次数也更少。

    OpenGL三⻆形环绕⽅式
    在默认情况下,OpenGL认为具有逆时针⽅向环绕的多边形为正⾯。

    GL_CW:顺时针环绕的多边形为正⾯
    GL_CCW:逆时针环绕的多边形为正⾯
    glFrontFace(GL_CW);
    
    

    4. 存储着⾊器

    4.1 初始化

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

    4.2 不同的存储着⾊器

    单元着⾊器

    参数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渲染架构

          本文链接:https://www.haomeiwen.com/subject/tglqvktx.html