这是一次尚未成功的尝试!
我想的是一个模型通过剖切后,可以把剖切部分半透明,其他的部分保持原样。但是当前仍不能实现,可能这是一个不能实现的效果吧。
1、当前的效果实现
下面的图是当前实现的较好的效果。可见上方被剖切的模型是透明的(alpha=0.1)。但是底部模型也变得透明了,这个不是期望的。
2、实现原理
代码改动非常少,第一是模型加载的时候需要设置其是透明模型,可以通过Style进行设置。
tileset.style=new Cesium.Cesium3DTileStyle({
color:"color('rgba(255,255,255,0.99)')"
})
第二是在剖切的函数ModelClippingPlanesStageFS.glsl中将原来需要被Discard的像元不Discard,而是标记为透明,最后在modelClippingPlanesStage阶段把标记为透明的像元调整alpha。
if (amount <= 0.0) {
//discard;
//原来应该discard的被标记为-1.
return -1.0;
}
//在modelClippingPlanesStage函数对其进行整理。
if(clipDistance < -0.9){
color.a=0.1;
}
else{
color=vec4(color.r,color.g,color.b,1.0);
}
虽然我最后强制把未被剖切的设置为不透明,但效果还是透明,如下:
3、可能的原因
在Cesium底层,透明对象是需要走OIT的。因此一旦将模型设置半透明,它只能实现渲染批次(DrawCommand)之间的前后排序。为了计算效率,平台并没有实现像素级的透明与非透明渲染控制。因此一旦判断是半透明,它都会采用半透明的策略对模型进行渲染。
4、其他尝试
我还尝试复制DrawCommand,一份DrawCommand用于渲染非透明,一份走透明流程。结果效果仍不好。
至于更详细的原因请期待后面的代码分析。