立体图元的绘制与渲染,之前的文章已经完全实现了图元的“颜色填充”,图元边框的绘制也有接触,详情可参考:OpenGL之矩阵堆栈绘制立体图元。
这里具体的介绍一下图元边框的绘制原理和流程:
-
首先,如果图元没有渲染边框 ,是什么效果呢?通过效果图,我们可以看到:图元分不清轮廓,看不清图元面与面的区分,很难看出图元具体是什么样子,这主要是因为出现类似ZFighting的问题,OpenGL中没有办法通过相同颜色的图层,来区分图层关系。
-
边框的绘制流程:
① 通过颜色填充绘制图元的基本形状;
② 开启多边形偏移,并设置偏移量(图层与图层之间设置间隙,才能渲染黑色边框);
③ 开启抗锯齿功能,让渲染的边框线更加光滑,不会显得太突兀;
④ 开启颜色混合,设置混合因子(平面和边框的颜色不同);
⑤ 设置边框绘制模式和边框的宽度(绘制线框几何黑色版三种模式:实心、边框、点;可以作用在正面、背面或者两面);
⑥ 绘制并填充边框;
⑦ 还原设置(通过调用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之立体图元的绘制和描边的原理和流程。