如果在画面中,发现有画面闪烁的问题。那么大多数情况下是z-fighting引起的,

解决方案:

1, 在每个场景中,找到那个MainCamera,然后在Inspector上,找到MainCamera的属性,Clipping Planes,需要做的是尽量放大near的值,尽量减小far的值。根据我的实验结果,同样改动Near值的幅度比Far值的幅度相对来说效果会更好。如Near从1到20可能修正了某个z-fighting,但是Far从1000改到500也还是没有用。这个在实践中可以注意。

2, 如果场景没有办法改动上述的值,那么还有的方式就是找到产生z-fighting的模型,让模型产生这个现象的两个面尽量离开一些距离,究竟多少距离只有通过实验才知道。

3, 如果可能,程序上就可以用Polygon Offset,这个是OpenGL的接口,

  1. drawOnePlane();
  2. //Draw other plane in the almost same position, before use offset, it will fighting with the one we has drawn.
  3. glEnable( GL_POLYGON_OFFSET_FILL );
  4. glPolygonOffset( g_OffsetFactor, g_OffsetUnit );
  5. drawOtherPlane();
  6. glPolygonOffset( 0.0f, 0.0f );
  7. glDisable( GL_POLYGON_OFFSET_FILL );



4、如果是D3D,那么这篇文章提到3中方式,最后一种方式是跟上面的OpenGL思路一样的。

http://software.intel.com/zh-cn/articles/alternatives-to-using-z-bias-to-fix-z-fighting-issues/

a, project matrix

  1. // ZFighting Solution #1 - Projection Matrix
  2. D3DXMATRIX mProjectionMat;   // Holds default projection matrix
  3. D3DXMATRIX mZBiasedProjectionMat;   // Holds ZBiased projection matrix
  4. // Globals used for Projection matrix
  5. float g_fBaseNearClip   =   1.0f;
  6. float g_fBaseFarClip    = 100.0f;
  7. // Code indicates no change. ie states 'near and far clipping planes pushed out' but only far appears pushed
  8. float g_fNearClipBias   =   0.0f;
  9. float g_fFarClipBias    =   0.5f;
  10. // Projection Matrix work around
  11. // Best if calculation are done outside of render function.
  12. // The "zbiased" projection has it near and far clipping
  13. // planes pushed out...
  14. D3DXMatrixPerspectiveFovLH( &mZBiasedProjectionMat, D3DX_PI/4,(mProjectionMat._22/mProjectionMat._11),
  15. g_fBaseNearClip + g_fNearClipBias,
  16. g_fBaseFarClip + g_fFarClipBias  );
  17. . . .
  18. // Original projection is loaded
  19. m_pd3dDevice ->SetTransform( D3DTS_PROJECTION, & mProjectionMat);
  20. // Billboards are rendered...
  21. // The "zbiased" projection is loaded ...
  22. m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &mZBiasedProjectionMat);
  23. // Posters are rendered...
  24. // Original projection is reloaded...
  25. g_pd3dDevice->SetTransform( D3DTS_PROJECTION, & mProjectionMat);
  26. . . .

b, view port matrix

  1. // ZFighting Solution #2 - Viewport
  2. D3DVIEWPORT9 mViewport;             // Holds viewport data
  3. D3DVIEWPORT9 mNewViewport;          // Holds new viewport data
  4. // Global used for Viewport
  5. // Hard coded for ZBIAS of 1 using this formula
  6. //          MinZ - 256/(2^24-1) and
  7. //          MaxZ - 256/(2^24-1)
  8. // 2^24 comes from the amount of Zbits and the 256 works
  9. // for Intel (R) Integrated Graphics, but can be any
  10. // multiple of 16.
  11. float g_fViewportBias   = 0.0000152588f;
  12. // Projection Matrix work around
  13. // Viewport work around
  14. m_pd3dDevice->GetViewport(&mViewport);
  15. // Copy old Viewport to new
  16. mNewViewport = mViewport;
  17. // Change by the bias
  18. mNewViewport.MinZ -= g_fViewportBias;
  19. mNewViewport.MaxZ -= g_fViewportBias;
  20. . . .
  21. // Original viewport is reloaded …
  22. m_pd3dDevice->SetViewport(&mViewport);
  23. // Billboards are rendered …
  24. // The new viewport is loaded …
  25. m_pd3dDevice->SetViewport(&mNewViewport);
  26. // Posters are rendered …
  27. // Original viewport is reloaded …
  28. m_pd3dDevice->SetViewport(&mViewport);
  29. . . .

c, depth - bias

  1. BOOL                    m_bDepthBiasCap;        // TRUE, if device has DepthBias Caps
  2. // Globals used for Depth Bias
  3. float g_fSlopeScaleDepthBias    = 1.0f;
  4. float g_fDepthBias              = -0.0005f;
  5. float g_fDefaultDepthBias       = 0.0f;
  6. // Check for devices which support the new depth bias caps
  7. if ((pCaps->RasterCaps & D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS) &&
  8. (pCaps->RasterCaps & D3DPRASTERCAPS_DEPTHBIAS))
  9. {
  10. m_bDepthBiasCap = true;        // TRUE, if DepthBias Caps
  11. }
  12. // Billboards are rendered...
  13. // DepthBias work around
  14. if ( m_bDepthBiasCap ) // TRUE, if DepthBias supported
  15. {
  16. // Used to determine how much bias can be applied
  17. // to co-planar primitives to reduce z fighting
  18. // bias = (max * D3DRS_SLOPESCALEDEPTHBIAS) + D3DRS_DEPTHBIAS,
  19. // where max is the maximum depth slope of the triangle being rendered.
  20. m_pd3dDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, F2DW(g_fSlopeScaleDepthBias));
  21. m_pd3dDevice->SetRenderState(D3DRS_DEPTHBIAS, F2DW(g_fDepthBias));
  22. }
  23. // Posters are rendered...
  24. if ( m_bDepthBiasCap ) // TRUE, if DepthBias supported
  25. {
  26. // DepthBias work around
  27. // set it back to zero (default)
  28. m_pd3dDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, F2DW(g_fDefaultDepthBias));
  29. m_pd3dDevice->SetRenderState(D3DRS_DEPTHBIAS, F2DW(g_fDefaultDepthBias));
  30. }
  31. . . .

5,这里还有一篇文章教到怎么样在面上画出线的,相信你也会遇到同样的问题。当然,核心还是用depth-bias,但是,人家把怎么做和做的时候要注意的问题都写上了(主要就是用bias的时候值不要取的太大,否则线框是渲染出来了,但是也同时多出线来了,因为本来是该本剪切的,经过修正可能就不被剪切了)。值得一看。

http://www.catalinzima.com/samples/12-months-12-samples-2008/drawing-wireframes-without-z-fighting/


背景原理:

z-fighting的出现是的不同面上的像素在z-buffer中的值相近,导致前台取像素的时候一会去这个面的,一会取那个面的。改变照相机的near、far属性会涉及到z-buffer中的值的精度。因为在各个平台上z-buffer位数不同,因此改变near和far能给z-buffer中的值的浮点数部分尽量留出空间,消除z-fighting。

这个是wiki上的z-fighting的例子,可以看到不同色彩的面,因为z-buffer的精度设置的小,然后两个面放置的比较近,因此出现了相关的穿插显示的问题。

z-fighting在unity中的解决方式的更多相关文章

  1. Unity中关于作用力方式ForceMode的功能注解

    功能注解:ForceMode为枚举类型,用来控制力的作用方式,有4个枚举成员,在以下举例中均设刚体质量为m=2.0f,力向量为f=(10.0f,0.0f,0.0f). (1)ForceMode.For ...

  2. sqlserver导入excel的电话号码(身份证)变为科学计数解决方式

    如果excel中有一列存的是手机号码或者身份证号码,那么导入到sql中时,会把手机或者身份证当作数字格式对待,因而会以科学记数法的形式存在sqlserver表中,解决方式,先将excel文件另存为文本 ...

  3. C++中避免内存泄露常见的解决方式

    常见内存泄露及解决方式-选自ood启发录 new/delete, array new/arrray delete匹配 case 1: 在类的构造函数与析构函数中没有匹配地调用 new/delete! ...

  4. Unity中几个特殊路径在各个平台的访问方式

    1.文件路径Resources:Unity在发布成移动端项目后,其他文件路径都将不存在,但是如果有一些必要的资源,可以放在Resources文件夹下,因为这个文件夹下的所有资源是由Unity内部进行调 ...

  5. js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式

    js replace 全局替换   js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...

  6. Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug

    问题背景: 现在在搞PC端应用开发,我们开发中需要调用系统的窗口以及需要最大化最小化,缩放窗口拖拽窗口,以及设置窗口位置,去边框等功能 解决根据: 使用user32.dll解决 具体功能: Unity ...

  7. https 页面中引入 http 资源的解决方式

    相对协议 应用场景 浏览器默认是不允许在 https 里面引用 http 资源的,一般都会弹出提示框. 用户确认后才会继续加载,用户体验非常差. 而且如果在一个 https 页面里动态的引入 http ...

  8. mysql中limit与in不能同时使用的解决方式.

    mysql中limit与in不能同时使用的解决方式. 分类: MySQL2011-10-31 13:53 1277人阅读 评论(0) 收藏 举报 mysqlsubquery MySQL5.1中子查询是 ...

  9. 使用questionsModel.values()后不能获取模型中的属性对应的外键属性值的解决方式

    class QuestionsModel(models.Model): author = models.ForeignKey(FrontUserModel,null=True) content = m ...

随机推荐

  1. 《Linux企业应用案例精解(第2版)》新书发售啦

    本书在出版当年就获得了不错的销量,同时被中国科学院国家科学图书馆.中国国家图书馆.首都图书馆.清华大学.北京大学等上百所国内综合性大学图书馆收录为馆藏图书,在IT业界赢得了良好的口碑.随后2012年年 ...

  2. javascript call与apply关键字的作用

    apply接受两个参数.第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合. call则是apply的语法糖,如果参数数量固定,则可以不用带下标的集合传第二个参数. 1 2 3 4 ...

  3. Nancy+BUI+SQLite自动更新服务端和客户端保护更新程序

    写了一个自动更新服务网站和自动更新客户端.基本功能测试完毕.记录下 项目地址:https://github.com/TeemoHQ/AutoUpdate 需求 自动集成,回退版本,守护进程,服务端操作 ...

  4. Android常用客户端测试工具

    Emmagee GT iTest PowerTutor 网速限制 Root Explorer ApkEditor 陆续添加...

  5. ArrayList的使用方法(转载)

    转载自: http://i.yesky.com/bbs/jsp/view.jsp?articleID=889992&forumID=150 1.什么是ArrayList    ArrayLis ...

  6. VS2010安装帮助文档出现错误

    安装VS2010后的帮助文档安装出现错误:未能在指定文件夹中创建本地存储区 安装完VS2010后,出现错误,取消后 再安装MSDN 打开“Help Library 管理器 - Microsoft He ...

  7. java注解(Annotation)解析

    注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...

  8. 【转】Mac系统中安装homebrew(类似redhat|Centos中的yum;类似Ubuntu中的apt-get)

    Homebrew,Homebrew简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,可以说Homebrew就是mac下的apt-get.yum神器 Homebr ...

  9. jquery实现旋转木马的插件slick

    旋转木马的是一般网站上都会有的图片轮播效果, html: <section id="features" class="blue" style=" ...

  10. 再议C风格变量声明

    NeoRAGEx2002曾经有一篇文章提到这个问题,但是有很多内容并没有包括,例如const和__declspec. 最近我遇到一些这方面的问题,感觉有必要做一个系统性的总结.后来经过一些实验,得出了 ...