当前位置: 首页 > news >正文

漫画网站建设教程视频网站模块建设建议

漫画网站建设教程视频,网站模块建设建议,购物网站优惠券怎么做,php网站开发薪资目录 1. 问题的提出 2. Z冲突#xff08;z-fighting#xff09;简介 2.1. Z冲突#xff08;z-fighting#xff09;产生的原因 2.2. 如何消除Z冲突#xff08;z-fighting#xff09; 3. 代码实现 1. 问题的提出 今天绘制了一个棋盘格#xff0c;鼠标在棋盘格上单击…目录 1. 问题的提出 2. Z冲突z-fighting简介 2.1. Z冲突z-fighting产生的原因 2.2.  如何消除Z冲突z-fighting 3. 代码实现 1. 问题的提出 今天绘制了一个棋盘格鼠标在棋盘格上单击在单击点绘制一个红色的圆但圆形始终不正常圆的颜色有的地方有有的地方没有如下 正常的情况下应该向下面那样 这个问题是由于OpenGL深度测试带来Z冲突z-fighting引起的。起始的绘制圆的代码如下 // 画点。以小圆表示其中参数pt表示鼠标单击时的世界坐标 void osgCardinal::drawEllipse(const osg::Vec3d pt) {auto pGeometry new osg::Geometry;auto pVertArray new osg::Vec3Array;_radius 0.2;auto twoPi 2 * 3.1415926;for (auto iAngle 0.0; iAngle twoPi; iAngle 0.001){auto x pt.x() _radius * std::cosf(iAngle);auto y pt.y() _radius * std::sinf(iAngle);auto z pt.z(); pVertArray-push_back(osg::Vec3d(x, y, z));}pGeometry-setVertexArray(pVertArray);auto pColorArray new osg::Vec4Array;pColorArray-push_back(osg::Vec4d(1.0, 0.0, 0.0, 1.0));pGeometry-setColorArray(pColorArray/*, osg::Array::BIND_OVERALL*/);pGeometry-setColorBinding(osg::Geometry::BIND_OVERALL);...... // 其它代码略 }2. Z冲突z-fighting简介 2.1. Z冲突z-fighting产生的原因 为什么会产生z-fighting现象 第一点原因 场景中渲染多个三维物体的时候当这多个三维物体摆放的位置很接近时导致在深度缓冲测试的时候会产生精度的误差然后会导致几个物体之间的片段值在通过深度测试时有时A物体通过有时B物体通过导致交替显示这几个物体的颜色值然后那就会产生闪烁的现象这种闪烁现象在场景旋转时尤其明显。 第二点原因 采用透视投影矩阵渲染的场景其深度缓冲区存储深度值ndc空间中也存储了深度值。而ndc空间的深度值是经由透视空间转换过来的ndc空间的深度值与透视空间的深度值转换并非是线性的而是非线性。大家都知到透视空间转换到ndc空间会有一步透视除法是除以z值。这样就会导致离视点越近的物体的片段深度值是越精确的离视点距离越远的物体的片段的深度值是越不精确的。这样就会导致z-fighting问题。 而采用正交透视矩阵渲染场景其变换是线性的为什么因为其透视空间转换为ndc空间的时候采用的透视除法是除以1所以其片段距离视点的深度值是线性的这样除非你把两个物体设置的位置非常接近否则是产生不了z-fighting这种现象的。 2.2.  如何消除Z冲突z-fighting 1.第一种方法 第一个也是最重要的技巧是永远不要把多个物体摆得太靠近以至于它们的一些三角形会重叠。通过在两个物体之间设置一个用户无法注意到的偏移值你可以完全避免这两个物体之间的深度冲突。在箱子和地板的例子中我们可以将箱子沿着地板向上方向稍微移动一点。箱子位置的这点微小改变将不太可能被注意到但它能够完全减少深度冲突的发生。然而这需要对每个物体都手动调整并且需要进行彻底的测试来保证场景中没有物体会产生深度冲突。 2.第二种方法 第二个技巧是尽可能将近平面设置远一些。在前面我们提到了精度在靠近近平面时是非常高的所以如果我们将近平面远离观察者我们将会对整个平截头体有着更大的精度。然而将近平面设置太远将会导致近处的物体被裁剪掉所以这通常需要实验和微调来决定最适合你的场景的近平面距离。   3.第三种方法 另外一个很好的技巧是牺牲一些性能使用更高精度的深度缓冲。大部分深度缓冲的精度都是24位的但现在大部分的显卡都支持32位的深度缓冲这将会极大地提高精度。所以牺牲掉一些性能你就能获得更高精度的深度测试减少深度冲突。 我们上面讨论的三个技术是最普遍也是很容易实现的抗深度冲突技术了。还有一些更复杂的技术但它们依然不能完全消除深度冲突。深度冲突是一个常见的问题但如果你组合使用了上面列举出来的技术你可能不会再需要处理深度冲突了。 3. 代码实现 在1节代码中加入消除Z冲突的代码如下 // 画点。以小圆表示其中参数pt表示鼠标单击时的世界坐标 void osgCardinal::drawEllipse(const osg::Vec3d pt) {auto pGeometry new osg::Geometry;auto pVertArray new osg::Vec3Array;auto pPgo new osg::PolygonOffset();pPgo-setFactor(-1.0);pPgo-setUnits(-1.0);pGeometry-getOrCreateStateSet()-setAttributeAndModes(pPgo);_radius 0.2;auto twoPi 2 * 3.1415926;for (auto iAngle 0.0; iAngle twoPi; iAngle 0.001){auto x pt.x() _radius * std::cosf(iAngle);auto y pt.y() _radius * std::sinf(iAngle);auto z pt.z()/* 0.001*/; pVertArray-push_back(osg::Vec3d(x, y, z));}pGeometry-setVertexArray(pVertArray);auto pColorArray new osg::Vec4Array;pColorArray-push_back(osg::Vec4d(1.0, 0.0, 0.0, 1.0));pGeometry-setColorArray(pColorArray/*, osg::Array::BIND_OVERALL*/);pGeometry-setColorBinding(osg::Geometry::BIND_OVERALL);...... // 其它代码略 }上述代码通过构造osg::PolygonOffset对象加入了多边形漂移从而解决了Z冲突问题。osg::PolygonOffse类的功能封装了OPenGL中的glPolygonOffset函数关于该函数的具体用法参见如下链接 glPolygonOffset用法。      OpenGL深度测试带来的问题----Z冲突 。 可以不用osg::PolygonOffset类将16行代码的注释取消即将z值加个微小的值这个值自己可以进行微调直到人眼觉察不到圆和棋盘格脱离且消除了1节中提到的现象为止。
http://www.hkea.cn/news/14392763/

相关文章:

  • 天津建站方案yzipi主题wordpress
  • 百度网站体检整合营销的概念
  • 网络推广网站怎么做网站开发一般用什么软件有哪些
  • 手机端网站思路wordpress 移动端主题
  • 南皮县网站建设价格社交博客网站开发
  • 揭东建设局网站旅游类网站开发任务书
  • 东莞微网站建设多少钱单位网站建设做到哪个科目
  • 做网站提升公司形象施工企业跨专业接工作是否有效
  • 国外素材网站深圳龙岗发布通告
  • 网站过期怎么找回来厦门门户网站建设
  • php 移动网站开发wordpress关闭自适应
  • 西部数码成品网站电子政务网站建设的步骤一般为
  • 人寿保险网站装修公司的口碑排名
  • 公司网站开发教程做的最好的视频教学网站
  • 网站建设图片编辑网络架构图
  • 网站制作公司服务贵州华瑞网站建设有限公司
  • 网站预订模板怎么做石家庄市建设厅官网
  • 网站建设 考核指标soe搜索优化
  • 网站建设流程有公众号网页版
  • 网站服务器是主机吗自己怎样在百度上做推广
  • 建站程序asp如何建设网站视频
  • 海口网站建设方案网站怎么做反爬虫
  • 周口城乡建设局网站漳州手机网站建设
  • 网站建设一般是用哪个软件wordpress 搭建教程
  • 网站维护收费标准女生学建筑工程技术就业前景
  • 行知智网站建设快速网站备案多少钱
  • 如何建立自己网站教程誓做中国最大钓鱼网站
  • 无锡网站设计多少钱怎么样销售关于网站建设
  • 山东建设人才网站wordpress手机上导航俩字
  • 杭州信贷网站制作行业网站建设公司