美文网首页
渲染优化

渲染优化

作者: infoyou | 来源:发表于2019-06-21 17:30 被阅读0次

    油画法

    • 先绘制远的再绘制近的

    正背面剔除 [Face Culling]

    • 立方体有6个面,看立方体最多能看到3个面,只渲染能看到的,性能提升50%
    • 丢弃背面朝向的面,这样可以节约片元着色器的性能。
    • 区分正背面,渲染顶点的顺序 ,[逆时针为正面,顺时针为背面]

    深度测试 先判断再填充

    • 深度缓冲区
      深度就是像素点在3D中距离摄像机的距离,Z值
    • 颜色缓冲区

    ZFighting 闪烁

    • 开启深度测试后,OpenGL就不会绘制模型遮挡的部分,这样实现的显示更加真实,但是由于深度缓冲区的精度限制,假如两个两者深度非常接近的时候,OpenGL 就无法正确判断出两者的深度值,会导致渲染的结果无法预测,显示出来的图像交错闪烁。(如下图时而渲染出绿色,时而渲染出红色,无法确定,交错闪烁)

    • 解决方法

    1. 启⽤用 Polygon Offset ⽅方式解决

    让深度值之间产生区别,在执行深度测试前将物体的深度值做一些细微的增加,于是就能将重叠的2个图形深度值之间有所区分

    //启用Polygon Offset
    glEnable(GL_POLYGON_OFFSET_FILL)
    参数列表:
    GL_POLYGON_OFFSET_POINT
    GL_POLYGON_OFFSET_LINE
    GL_POLYGON_OFFSET_FILL
    
    2. 指定偏移量
    void glPolygonOffset(Glfloat factor,Glfloat units);
     
    应⽤到片段上总偏移计算⽅方程式:
    Depth Offset = (DZ * factor) + (r * units); DZ:深度值(Z值)
     
    r:使得深度缓冲区产生变化的最小值
    负值,将使得z值距离我们更近,而正值,将使得z值距离我们更远,我们设置factor和units设置为-1,-1
    
    3. 关闭Polygon Offset
    glDisable(GL_POLYGON_OFFSET_FILL)
    
    预防
    • 不要将两个物体靠的太近,避免渲染时三角形叠在一起。这种方式要求对场景中物体插入一个少量的偏移,那么就可能避免ZFighting现象。例如⽴⽅体和平面问题中,将平面下移0.001f就可以解决这个问题。当然⼿动去插入这个小的偏移是要付出代价的。
    • 尽可能将近裁剪⾯设置得离观察者远一些。尽可能让近裁剪⾯远一些的话,会使整个裁剪范围内的精确度变高一些。但是这种方式会使离观察者较近的物体被裁减掉,因此需要调试好裁剪面参数
      离观察者较近的物体被裁减掉,因此需要调试好裁剪面参数。
    • 使用更高位数的深度缓冲区,通常使用的深度缓冲区是24位的,现在有一些硬件使用32位的缓冲区,使精确度得到提⾼。

    相关文章

      网友评论

          本文标题:渲染优化

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