[OpenGL][SharpGL]用Polygon Offset解决z-fighting和stitching问题

当GO.db安装失败时,生物信息学新手应该知道的5个底层逻辑 本文为生物信息学新手提供了解决GO.db安装失败的5个关键底层逻辑,包括网络连接与镜像源设置、版本兼容性检查、依赖关系管理、SQLite存储机制理解以及调试技巧。特别针对Bioconductor的GO.db包安装问题,详细介绍了如何通过切换国内镜像、管理版本冲突和解决依赖问题来成功安装,帮助用户高效克服常见安装障碍。 阅读详情

[OpenGL][SharpGL]用Polygon Offset解决z-fighting和stitching问题

本文参考了(http://www.zeuscmd.com/tutorials/opengl/15-PolygonOffset.php),用SharpGL重写了示例代码,您可以点击文末的链接下载。

什么是stitching和z-fighting

在OpenGL中,如果想绘制一个多边形同时绘制其边界,可是先使用多边形模式GL_FILL绘制物体,然后使用多边形模式GL_LINE和不同的颜色再次绘制这个多边形。但是由于直线和多边形的光栅化方式不同,导致位于同一位置的多边形和直线的深度值并不相同,进而导致直线有时在多边形的里面,有时在多边形的外面,这种现象就是"Stiching"。

而Z-fighting主要是指当两个面共面时,二者的深度值一样,深度缓冲就不能清楚的将它们两者分离开来,位于后面的图元上的一些像素就会被渲染到前面的图元上,最终导致图象在帧与帧之间产生微弱的闪光。

(上面这几段是从(http://blog.youkuaiyun.com/oglmatrix/article/details/1793074)复制来的。)

 

Polygon Offset效果图

解决这两个问题的方法就是使用Polygon Offset,当然你也可以使用模板测试,但Polygon Offset的速度会比模板缓存快。

 

下面就是stitching的情况。


下面就是z-fighting的情况。


 

而理想的效果是这样的:


下面是下文将介绍的Demo。


这是没有使用Polygon Offset的情况。


这是使用了Polygon Offset的情况。

 

如何使用Polygon Offset

下面用上图所示的模型来演示如何使用Polygon Offset。我们要画一个立方体,立方体的黑色线框,还有3个正方形。

Offset开关

我们用一个bool变量记录是否启用Polygon Offset。这样就可以看清楚这项技术的效果了。

      /// <summary>
       /// determins whether enalbe or disable polygon offset.
        /// </summary>
      private bool offset = true;


用立方体演示stitching

我们画一个立方体和它的线条,用于演示stitching。

void drawBox(OpenGL gl)
        {
            gl.Begin(OpenGL.GL_QUADS);
            // FRONT
            gl.Vertex(-0.5f, -0.5f, 0.5f);
            gl.Vertex(0.5f, -0.5f, 0.5f);
            gl.Vertex(0.5f, 0.5f, 0.5f);
            gl.Vertex(-0.5f, 0.5f, 0.5f);
            // BACK
            gl.Vertex(-0.5f, -0.5f, -0.5f);
            gl.Vertex(-0.5f, 0.5f, -0.5f);
            gl.Vertex(0.5f, 0.5f, -0.5f);
            gl.Vertex(0.5f, -0.5f, -0.5f);
            // LEFT
            gl.Vertex(-0.5f, -0.5f, 0.5f);
            gl.Vertex(-0.5f, 0.5f, 0.5f);
            gl.Vertex(-0.5f, 0.5f, -0.5f);
            gl.Vertex(-0.5f, -0.5f, -0.5f);
            // RIGHT
            gl.Vertex(0.5f, -0.5f, -0.5f);
            gl.Vertex(0.5f, 0.5f, -0.5f);
            gl.Vertex(0.5f, 0.5f, 0.5f);
            gl.Vertex(0.5f, -0.5f, 0.5f);
            // TOP
            gl.Vertex(-0.5f, 0.5f, 0.5f);
            gl.Vertex(0.5f, 0.5f, 0.5f);
            gl.Vertex(0.5f, 0.5f, -0.5f);
            gl.Vertex(-0.5f, 0.5f, -0.5f);
            // BOTTOM
            gl.Vertex(-0.5f, -0.5f, 0.5f);
            gl.Vertex(-0.5f, -0.5f, -0.5f);
            gl.Vertex(0.5f, -0.5f, -0.5f);
            gl.Vertex(0.5f, -0.5f, 0.5f);
            gl.End();
        }


用正方形演示z-fighting

我们在立方体的一个面上,画几个正方形,用于演示z-fighting。

 

void drawPolygon(OpenGL gl)
        {
            gl.Begin(OpenGL.GL_QUADS);
            gl.Vertex(-0.5f, -0.5f, 0.0f);
            gl.Vertex(0.5f, -0.5f, 0.0f);
            gl.Vertex(0.5f, 0.5f, 0.0f);
            gl.Vertex(-0.5f, 0.5f, 0.0f);
            gl.End();
        }

启用Polygon Offset

Polygon Offset有多种使用方式。其中之一就是把立方体推远一点点,这样,线框和正方形就与立方体有了间隔,就不会产生干涉。(我的理解是,在执行深度测试前立方体的深度值被稍微增加了一点点,于是就跟线框区分开了。)

启用Polygon Offset有三个可选参数(GL_POLYGON_OFFSET_POINT, GL_POLYGON_OFFSET_LINE 和GL_POLYGON_OFFSET_FILL),分别对应3种光栅化模式(GL_POINT, GL_LINE 和GL_FILL)。

首先来渲染立方体,我们用GL_POLYGON_OFFSET_FILL来启用Polygon Offset。

    if (offset)
           {
             gl.Enable(OpenGL.GL_POLYGON_OFFSET_FILL);


 

指定偏移量

启用了Polygon Offset,那么到底要把立方体推远多少呢?这需要用glPolygonOffset来指定。glPolygonOffset需要2个参数:GLfloat factor 和GLfloat units。

每一个Fragment的深度值都会增加如下所示的偏移量:

offset = (m * factor) + (r * units)

m是多边形的深度的斜率(在光栅化阶段计算得出)中的最大值。这句话难以理解,你只需知道,一个多边形越是与近裁剪面(near clipping plan)平行,m就越接近0。

r是能产生在窗口坐标系的深度值中可分辨的差异的最小值,r是由具体实现OpenGL的平台指定的一个常量。

一个大于0的offset 会把模型推到离你(摄像机)更远一点的位置,相应地,一个小于0的offset 会把模型拉近。

如果想要非常好地使用Polygon Offset,你需要做一些数学上的研究。不过一般而言,只需把1.0和0.0这样简单的值赋给glPolygonOffset即可满足需要。

我们要把立方体推远一点,所以

              gl.PolygonOffset(1.0f, 1.0f);
           }


 

然后,我们绘制立方体,并关闭Polygon Offset。

gl.Color(1.0f, 0.0f, 0.0f);
            gl.PolygonMode(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_FILL);
            drawBox(gl);

           if (offset)
               gl.Disable(OpenGL.GL_POLYGON_OFFSET_FILL);


 

绘制正方形

我们已经推远了立方体,所以原本在立方体平面上的绿色和黄色正方形就没有z-fighting现象了。直接绘制即可。

gl.Color(0.0f, 1.0f, 0.0f);
            gl.PushMatrix();
            gl.Translate(-0.25f, -0.25f, 0.5f);
            gl.Scale(0.5f, 0.5f, 0.5f);
            drawPolygon(gl);
            gl.PopMatrix();

            gl.Color(1.0f, 1.0f, 0.0f);
            gl.PushMatrix();
            gl.Translate(0.25f, 0.25f, 0.5f);
            gl.Scale(0.5f, 0.5f, 0.5f);
            drawPolygon(gl);
            gl.PopMatrix();



注意,绿色和黄色正方形两者之间没有重叠的部分,所以不会有z-fighting现象。

但是蓝色正方形与绿色、黄色正方形都有重叠,所以会有z-fighting现象。为避免此现象,我们把-1.0赋予glPolygonOffset,即拉近蓝色正方形。

if (offset)
            {
                gl.Enable(OpenGL.GL_POLYGON_OFFSET_FILL);
                gl.PolygonOffset(-1.0f, -1.0f);
            }

            gl.Color(0.0f, 0.0f, 1.0f);
            gl.PushMatrix();
            gl.Translate(0.0f, 0.0f, 0.5f);
            gl.Scale(0.5f, 0.5f, 0.5f);
            drawPolygon(gl);
            gl.PopMatrix();

            if (offset)
                gl.Disable(OpenGL.GL_POLYGON_OFFSET_FILL);


绘制立方体的线框

如果直接绘制立方体的线框,线框会与立方体产生stitching现象。所以,如同拉近蓝色正方形一样,我们也把线框拉近一点。不同的是,我们把GL_POLYGON_OFFSET_LINE赋予glEnable。

if (offset)
            {
                gl.Enable(OpenGL.GL_POLYGON_OFFSET_LINE);
                gl.PolygonOffset(-1.0f, -1.0f);
            }

            gl.Color(0.0f, 0.0f, 0.0f);
            gl.PolygonMode(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_LINE);
            drawBox(gl);

            if (offset)
                gl.Disable(OpenGL.GL_POLYGON_OFFSET_LINE);

启用\禁用Polygon Offset

我们用A键开控制是否启用Polygon Offset功能。

void openGLControl_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A)
            {
                offset = !offset;
            }
        }

到此,Demo讲解完毕,您可以在上文查看启用\禁用Polygon Offset的效果。

如果你发现及时使用了glPolygonOffset()也无效,那么可能是因为你只对面启用了glPolygonOffset,而没有对线条也启用glPolygonOffset。
如果您愿意花几块钱请我喝杯茶的话,可以用手机扫描下方的二维码,通过微信捐赠。(微信捐助不显示您的信息,如需要,请注明您的联系方式)我会努力写出更好的文章。
Thank you for your kindly donation! 微信捐赠二维码:
Donate by microMsg:

原文地址:http://www.cnblogs.com/bitzhuwei/p/polygon-offset-for-stitching-andz-fighting.html

Android Update Engine 分析(三四)OTA 签名都支持哪些算法? 写了几十篇还没涉及到 OTA 签名算法细节,OTA 讨论群也很少问这个,毕竟签名算法纯理论的问题,一旦实现好就极少需要改动,只需要进行一些配置,准备好签名的秘钥和证书就可以了。限于签名的算法理论太过于抽象,本篇不讨论签名算法细节,但会总结一些签名操作。以及 Android OTA 包支持的签名算法。本文主要分析 Update Engine 中支持的签名算法,以及这些算法的操作实现(不涉及原理部分),并总结签名和验签使用的 key。 阅读详情

相关推荐

基于NXP BFU730F的宽带WiFi LNA设计:从原理到实测的完整指南

低噪声放大器(LNA)是无线通信接收链路中的关键器件,其性能直接决定了系统的接收灵敏度。LNA的核心原理是在放大微弱信号的同时,尽可能降低自身引入的噪声,并保持良好的线性度以应对强干扰。在宽带应用场景下,如覆盖2.4GHz至5.9GHz的现代WiFi系统,设计需在宽带匹配、噪声优化和增益平坦度之间取得精妙平衡。本文以NXP的BFU730F SiGe:C HBT晶体管为核心,深入解析一种采用电阻反馈和LC匹配网络的经典宽带LNA架构。该设计通过优化反馈网络,在宽达3.5GHz的频带内实现了优异的噪声系数(低至

weixin_33587161的博客 326

WebGL - 可视空间,深度处理,顶点索引

研究内容大概如下: 以用户视角进入三围世界 控制三围可视空间 裁剪 处理物体的前后关系 绘制三围的立方体 上面会讲到如何使用模型矩阵、视图矩阵、以及该投影矩阵的使用,并且最后会绘制一个三维的立方体; 1、立方体由三角形构成 如图所示,三维物体都是由三角面构成的,因此逐个的去绘制三角形就能绘制出三维物体。但是三维跟二维有一个显著的区别,绘制二维只需要考虑x,y轴,而绘制三维物体的时候,需要考虑...

ithanmang 2569

玩转 Milvus(二):在 Ubuntu 22.04(WSL2)上安装 Milvus

本文详细介绍了在Ubuntu 22.04(WSL2)环境下安装Milvus向量数据库的两种单机模式:Milvus Lite和Milvus Standalone。Milvus Lite作为轻量级Python库,适合快速学习和小规模实验,只需通过pip安装即可使用。Milvus Standalone则支持Docker和Docker Compose两种部署方式,适合开发测试或小规模生产环境。文章对比了不同安装方式的优缺点,并提供了验证案例和常见问题解答,帮助开发者快速上手,实现简单的语义搜索功能。

企业级后端与 AI 应用开发双线探索 2507

Polygon Offset 使用方法

由于工作中经常遇到画线与画几何体并存的问题,这个时候,就会遇到下面的现象: 1,Stitching EffectZ-Fighting Effect 这个时候可以使用Polygon Offset来处理: 它有三种值可以设置,每种针对一个渲染方式: line, point , fill 模式, 如OPenGL下( GL_POINT, GL_LINE and GL_FILL), 对就在的开启函数如下: ...

大白的博客 4464

华为防火墙介绍和原理,配置详细解析

在出向外网的流量中,我们使用默认路由来指定默认的出口,并且使用nat地址转换,而在外网中,我们使用ISIS协议来进行路由的学习和更新,让外网可以访问到dmz非军事化区域的server1服务器。并进行NAT转换,实现了内部IP地址和外部IP地址之间的映射,以便内部网络可以与外部网络进行通信。网络地址转换(NAT):防火墙可实现网络地址转换,将内部私有IP地址转换成公共IP地址,以隐藏网络拓扑结构,增加网络安全性。确定安全需求:根据企业的安全需求和策略,确定防火墙的配置目标和规则。

外游者 5097

小龙虾 OpenClaw 权限全攻略:轻松激活 elevated (最新版 OpenClaw 自动化任务降智、无权限、无法执行sudo等系统命令、提升 elevated 权限的解决方案)

升级小龙虾 OpenClaw 后权限不足?elevated 报错?📛 本文教你如何正确配置 OpenClaw 权限💻,让自动化任务顺利执行 🚀

XiaoqiangClub的博客 733

OpenGL和OSG正背面剔除、深度缓冲区

当2个三维模型有2个面离得比较近的时候,在渲染的时候,在不同的视角下,会发现闪烁的现象,解决这个问题主要依靠opengl的polygonoffset的功能,osg有对应的类, osg::ref_ptrosg::PolygonOffset polyoffset = new osg::PolygonOffset; polyoffset->setFactor(m_factor); polyoffset->setUnits(m_units); node.getOrCreateStateSet()-&gt

whl0071的专栏 2756

不使用工具箱,通过MATLAB纯编程实现lstm网络的训练过程

长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 1013

第34节 实例-这叫个啥效果呢,颜色分段显示?

目录网友发来的效果图关键点其它本节代码注意有shader 网友发来的效果图 这个鸭头的特别之处在于颜色被分成了一段一段的,而且不是沿顶点来分的。网友自己做的效果如下: 本节的内容在网盘中: 请使用浏览器打开,平时遇到问题或加群也可以加我微信:13324598743: 链接:https://pan.baidu.com/s/13gwJLwo_LbRnN3Bl2NXXXw 提取码:xrf5 关键点 其实这个效果非常简单,只需要在顶点着色器中把颜色按顶点计算好,然后在片元着色器中进行规范: 我的顶点着色器计算颜

一切皆可视 1686

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

weixin_45735391的博客 12万+

MicroChip的SmartFusion2的M2S090芯片的全流程开发环境搭建和Demo设计

MicroChip的SmartFusion2的M2S090芯片的全流程开发环境搭建和Demo设计

qq_45806640的博客 455

OpenGL用Polygon Offset解决z-fighting和stitching

在OpenGL中,如果想绘制一个多边形同时绘制其边界,可是先使用多边形模式GL_FILL绘制物体,然后使用多边形模式GL_LINE和不同的颜色再次绘制这个多边形。但是由于直线和多边形的光栅化方式不同,导致位于同一位置的多边形和直线的深度值并不相同,进而导致直线有时在多边形的里面,有时在多边形的外面,这种现象就是"Stiching"。

积累点滴,保持自我 1002

9、储备池学习:从学习到学习的新范式

本文探讨了基于学习到学习(L2L)框架的储备池计算新范式,提出通过在外循环中优化储备池的超参数(如递归连接权重、输入权重和读出初始化),以提升其在多种任务中的内循环学习性能。研究展示了两种主要实验设置:一是优化储备池用于回归二阶Volterra滤波器任务,显著优于随机基线;二是实现无需调整读出权重、仅依赖内部动态学习非线性函数的能力,表明储备池可快速构建目标函数的内部模型并安装任务先验知识。结合流程图与表格,文章系统呈现了L2L的训练流程、技术细节及实验结果,并讨论了性能提升、泛化能力等开放问题,指出了未来

ujm56789012的博客 502

[OpenGL][SharpGL]用Polygon Offset解决z-fighting

阅读目录(Content)什么是stitching和z-fightingPolygon Offset效果图如何使用Polygon OffsetOffset开关用立方体演示stitching用正方形演示z-fighting启用Polygon Offset指定偏移量绘制正方形绘制立方体的线框启用\禁用Polygon Offset×××[OpenGL][SharpGL]用Polyg...

weixin_33691700的博客 143

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OSG中闪烁问题的解决(1)

这里写自定义目录标题 当2个三维模型有2个面离得比较近的时候,在渲染的时候,在不同的视角下,会发现闪烁的现象,解决这个问题主要依靠opengl的polygonoffset的功能,osg有对应的类, osg::ref_ptrosg::PolygonOffset polyoffset = new osg::PolygonOffset; polyoffset->setFactor(m_factor...

qq_35218408的博客 2866

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

解决osg绘制场景时因Z冲突导致重影或闪烁等不正常情况

z-fighting。

danshiming的博客 1352

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OpenGL 图元、 正背面剔除、深度测试(四)

1、基本图元连接方式   图元primitive,即图形元素,是可以编辑的最小图形单位。图元是图形软件用于操作和组织画面的最基本的素材。一幅画面由图元组成,图元是一组最简单的、最通用的几何图形或字符。 OpenGL的基本图元有点(Point)、线段(Line)、多边形(Ploygon)、三角形(Triangle)、四边形(Quadrangle)。 线段又分为独立线段、不闭合的线(Line Strip)和首尾闭合的线(Line Loop)。 三角形分为独立三角形、三角形链(Trian.

TanJiaXiang的博客 1461

OpenGL - Drawing Lines over Polygons and Using Polygon Offset 在多边形上画线并使用多边形偏移量

原文:Drawing Lines over Polygons and Using Polygon Offset Drawing Lines over Polygons and Using Polygon Offset 在多边形上画线并使用多边形偏移量 使用多边形偏移的基础是什么? 在OpenGL中很难渲染共面图元(primitive)有两个原因: 给定两个具有不同顶点的重叠共面图元,这两个多边形......

Jave.Lin 的学习笔记 2681

用Polygon Offset解决z-fighting和stitching问题

http://www.cnblogs.com/bitzhuwei/p/polygon-offset-for-stitching-andz-fighting.html 什么是stitching和z-fighting 在OpenGL中,如果想绘制一个多边形同时绘制其边界,可是先使用多边形模式GL_FILL绘制物体,然后使用多边形模式GL_LINE和不同的颜色再次绘制这个多边形。但是由于直线和多边形...

yaoyutian的博客 2828

glPolygonOffset的用法

一般的3D显示都通过深度缓冲区来处理遮挡问题,这样的好处就是不管绘制顺序如何,最终总能得到相同的结果。但是深度缓冲区的精度是有限的(一般是每个像素采用16bit或者24bit来表示深度),如果两次绘制到同一个像素时,深度值相差非常小,就有可能无法正确的辨别究竟哪一次绘制的深度值更

baozi3026的专栏 1万+

OpenGL

渲染过程中可能产生的问题油画渲染正面&背面剔除深度测试多边形模型多边形偏移裁剪颜色混合。

weixin_38432324的博客 924

osgFX实现方式解析

简介 osgFX是一个osg的附加库,是一个用于实现可重用特殊效果的架构工具,它实现的效果可以添加到OSG的节点中。它包含了一系列预定义好的特殊效果,osg3.2中主要有如下几种: Anisotropic Lighting 各向异性光照凹凸纹理卡通渲染刻画线立方图镜面高光轮廓线 具体的类结构如下图所示:

Frank的专栏 5801

openGL深度冲突z-fighting

openGL深度冲突 关于深度冲突(Z-Finghting or Depth Fighting)的解决

aoxuestudy的专栏 4967
上一篇: 法线的归一化和法线视图变换矩阵的正确设置
下一篇: 【基础教程】法线贴图原理与制作 粗解
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值