Cesium的RenderState解释及一些引用介绍

今天就梳理下RenderState,这是第2部分。

1、frontFace

如何规定三角面的顺序,包括COUNTER_CLOCKWISE、CLOCKWISE两个值,表示顺时针和逆时针,一般是COUNTER_CLOCKWISE

2、cull

规定三角面正面及背面如何处理,可以Enable(开启)或关闭。包括FRONT、BACK、FRONT_AND_BACK三个移除选项。

选择FRONT_AND_BACK的情况比较少,可以在调试、或只想保留一些特效情况下使用。

一般选择的是BACK,那什么情况会选择FRONT呢?

在3DTiles渲染过程中,父节点数量可以认为包含四个子节点,如果四个子节点只加载了一部分,比如3个,那么这时候就会很尴尬。子节点数据已经被加载,可以渲染得到更高清的效果,但是还差一个还得让父节点渲染。

为了得到最佳效果,这时候就可以将父节点与子节点都渲染。但是父节点与子节点做一次模版(Stencil)测试,如果测试通过,则渲染子阶段,否则渲染父阶段。更多信息可访问(Cesium3DTileBatchTable.deriveZBackfaceCommand)函数。

3、lineWidth

这个比较好理解,比如渲染全球的经纬度网格,可以设置不同的宽度。

4、polygonOffset

这有助于避免非常薄的双面墙壁闪烁。还是在函数Cesium3DTileBatchTable.deriveZBackfaceCommand中,这个参数可以让父子瓦片的闪面冲突降低。如果开启这个选项,那么在计算深度的时候,会对深度值进行一个调整,计算公式如下

float x = dFdx(depth);//dFdx 梯度
float y = dFdy(depth);
float m = sqrt(x * x + y * y);
depth += m * factor;
gl_FragDepth = log2(depth) * czm_oneOverLog2FarDepthFromNearPlusOne;
gl_FragDepth += czm_epsilon7 * units;

如果两个三角面非常非常近,或者说重叠,那么实际情况还是会闪面的,因为他们的depth是一样的。

4、scissorTest

scissorTest 是一种用于控制渲染区域的测试方法。它通过定义一个矩形区域(称为"剪裁区域")来限制渲染操作,只在该区域内进行像素绘制。换句话说,任何超出指定矩形的渲染内容都会被丢弃,而不会被绘制到最终的输出中。

这个方法,你也可以通过Shader来实现,虽然Shader复杂一点。在Cesium中,scissorTest主要用于Picker,即拣选对象。在用户点击拣选的时候,平台在下一次渲染就只渲染鼠标点击的那一小点区域,从而降低渲染压力,并能够获得拣选对象。关于拣选的技术我在这里就不展开。

5、depthTest

深度检测是三维中最重要的能力,一般都开启。但如有需要Sprite 渲染、绘制不透明物体等情况,那么可以对这类对象关闭深度检测。关闭深度检测可以提升渲染性能。

讲到深度信息,不得不提下Cesium平台的depthPlaneEllipsoidOffset 参数。由于Cesium渲染得到是一个球,如果正前方没有瓦片,或者瓦片间隙比较大的时候(低精度带高程时),就会出现一些穿透线。而背后处理的办法就是DepthPlane。但是,初步测试,这个特性并没有达到目的。

深度检测的另外一个选项是 depthMask,它用于决定是否可以写入深度。比如透明物体就设置为False。

6、colorMask

颜色掩码,可以让某些颜色不写入到显存。在Cesium中,拣选Cesium3DTileBatchTable.deriveZBackfaceCommand中,由于只需要写入BatchID到stencil中,因此会丢弃本来的颜色值。另外影像、阴影等情况也不需要写入颜色,可以提升渲染效率。

7、stencilMask

在Cull、colorMask提到了模版测试。在Cesium中,总共有四种掩码,分别为

  1. CESIUM_3D_TILE_MASK,值为0x80,     //1000 0000
  2. SKIP_LOD_MASK:                值为0x70,      //0111 0000

  3. SKIP_LOD_BIT_SHIFT:         值为4,        //0000 0100

  4. CLASSIFICATION_MASK:   值为0x0f,  //0000 1111

也就是前面第一位存储的是3D Tiles,接下来三位用于3D Tiles的LOD替换,后面四位用于分类。

在3D Tiles的多级LOD中,LOD的Level值就会被写入到模版中,用于检测像素上哪个瓦片最优。

8、 sampleCoverage

在WebGL中,gl.sampleCoverage 是一个用于控制多重采样抗锯齿(MSAA, Multi-Sample Anti-Aliasing)效果的函数。这是一种提高渲染质量的方法,它主要用于改善由于图形边缘的锯齿现象造成的视觉效果。sampleCoverage 允许开发者使用覆盖率值来设置片段的最终透明度,从而实现更平滑的图形效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值