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

Cesium着色器的创意和方法(六——透明和半透明)

这是一次尚未成功的尝试!

我想的是一个模型通过剖切后,可以把剖切部分半透明,其他的部分保持原样。但是当前仍不能实现,可能这是一个不能实现的效果吧。

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用于渲染非透明,一份走透明流程。结果效果仍不好。

至于更详细的原因请期待后面的代码分析。


http://www.kler.cn/a/414262.html

相关文章:

  • linux线程资源回收
  • Lombok :简化 Java 编程的得力工具
  • Rust学习笔记_04——引用
  • 鸿蒙学习统一上架与多端分发-快速上架(1)
  • 交通流量预测:基于交通流量数据建立模型
  • 【后端面试总结】Redis持久化
  • 展示和添加篮球队信息--laravel与elementplus
  • Flutter:GetBuilder页面模板,可复用,视图,控制器分离
  • IntelliJ IDEA安装内网穿透实现远程连接家里或公司的MySQL数据库助力开发
  • 【C语言】结构体、联合体、枚举类型的字节大小详解
  • 累积局部效应 (ALE) 图分析记录
  • Unity中Http框架
  • 微知-arp如何删除所有表项?(arp -d; ip neighbor delete 192.168.0.100)
  • 力扣—912. 排序数组
  • queue 和 Stack
  • Unity shaderlab 实现LineSDF
  • 根据中缀二叉树构建中缀表达式
  • 「Mac畅玩鸿蒙与硬件35」UI互动应用篇12 - 简易日历
  • Unity中的数学应用 之 插值函数处理角色朝向 (初中难度 +Matlab)
  • 【计算机网络】—— 物理层