OpenGL之图元描边的绘制流程

立体图元的绘制与渲染,之前的文章已经完全实现了图元的“颜色填充”,图元边框的绘制也有接触,详情可参考:OpenGL之矩阵堆栈绘制立体图元。
这里具体的介绍一下图元边框的绘制原理和流程:

  • 首先,如果图元没有渲染边框 ,是什么效果呢?通过效果图,我们可以看到:图元分不清轮廓,看不清图元面与面的区分,很难看出图元具体是什么样子,这主要是因为出现类似ZFighting的问题,OpenGL中没有办法通过相同颜色的图层,来区分图层关系。
    OpenGL之图元描边的绘制流程_第1张图片

  • 边框的绘制流程:
    ① 通过颜色填充绘制图元的基本形状;
    ② 开启多边形偏移,并设置偏移量(图层与图层之间设置间隙,才能渲染黑色边框);
    ③ 开启抗锯齿功能,让渲染的边框线更加光滑,不会显得太突兀;
    ④ 开启颜色混合,设置混合因子(平面和边框的颜色不同);
    ⑤ 设置边框绘制模式和边框的宽度(绘制线框几何黑色版三种模式:实心、边框、点;可以作用在正面、背面或者两面);
    ⑥ 绘制并填充边框;
    ⑦ 还原设置(通过调用glPolygonMode将多边形正面或者背面设为全部填充模式);

  • 具体代码:

void DrawWireFramedBatch(GLBatch* pBatch) {
     
    /*------------画绿色部分----------------*/
    /* GLShaderManager 中的Uniform 值——平面着色器
     参数1:平面着色器
     参数2:运行为几何图形变换指定一个 4 * 4变换矩阵
          --transformPipeline 变换管线(指定了2个矩阵堆栈)
     参数3:颜色值
    */
    shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vGreen);
    pBatch->Draw();
    
    /*-----------边框部分-------------------*/
    /*
        glEnable(GLenum mode); 用于启用各种功能。功能由参数决定
        参数列表:http://blog.csdn.net/augusdi/article/details/23747081
        注意:glEnable() 不能写在glBegin() 和 glEnd()中间
        GL_POLYGON_OFFSET_LINE  根据函数glPolygonOffset的设置,启用线的深度偏移
        GL_LINE_SMOOTH          执行后,过虑线点的锯齿
        GL_BLEND                启用颜色混合。例如实现半透明效果
        GL_DEPTH_TEST           启用深度测试 根据坐标的远近自动隐藏被遮住的图形
        
        glDisable(GLenum mode); 用于关闭指定的功能 功能由参数决定
     */
    
    // 画黑色边框
    glPolygonOffset(-1.0f, -1.0f);
    // 偏移深度,在同一位置要绘制填充和边线,会产生z冲突,所以要偏移
    glEnable(GL_POLYGON_OFFSET_LINE);
    
    // 画反锯齿,让黑边好看些
    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
    // 绘制线框几何黑色版 三种模式,实心,边框,点,可以作用在正面,背面,或者两面
    // 通过调用glPolygonMode将多边形正面或者背面设为线框模式,实现线框渲染
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    // 设置线条宽度
    glLineWidth(2.5f);
    
    /* GLShaderManager 中的Uniform 值——平面着色器
     参数1:平面着色器
     参数2:运行为几何图形变换指定一个 4 * 4变换矩阵
         --transformPipeline.GetModelViewProjectionMatrix() 获取的
          GetMatrix函数就可以获得矩阵堆栈顶部的值
     参数3:颜色值(黑色)
     */
    
    shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
    pBatch->Draw();

    // 复原原本的设置
    // 通过调用glPolygonMode将多边形正面或者背面设为全部填充模式
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glDisable(GL_POLYGON_OFFSET_LINE);
    glLineWidth(1.0f);
    glDisable(GL_BLEND);
    glDisable(GL_LINE_SMOOTH);
}
  • 效果展示:
    OpenGL之图元描边的绘制流程_第2张图片

  • 完整代码传送门:OpenGL之立体图元的绘制和描边的原理和流程。

你可能感兴趣的:(OpenGL,ES,iOS高级进阶,Swift高级进阶,深度测试,抗锯齿化,多边形偏移,颜色混合,图元绘制)