Cesium.js与3D查看器渲染出来的效果不一致的问题
三维查看器:
Cesium.js(有光照): 颜色偏暗,色差严重
Cesium.js(无光照 Light UNIT模式): 色差较小,缺少棱角
Cesium.js 1.97版本以上正式支持CustomShader,下面的代码以Cesium.js1.99为例
CustomShader参数:
mode分为 替换模式、修改模式『本文由“物图科技”原创』
lightModel 分为有光照模式PBR 和 无光照模式UNLIT
fragmentShaderText 为 片元着色器(片段代码)
1.ModelFS.glsl
如图所示
如果没有定义mode为修改模式,materialStage函数会获取模型的材质颜色。
如果定义了fragmentShaderText,就会在获取模型材质颜色后 运行自定义的代码
2.lightingStage函数
如果是有光照PBR模式,执行computePbrLighting计算颜色(色差产生的原因)
如果是无光照UNIT模式,直接使用materialStage计算出来的颜色。
两种模式分别对应 开头Cesium 的两张图。
3.computePbrLighting函数:
该函数根据输入的材质属性和处理后的顶点属性计算PBR光照。
首先,创建一个czm_pbrParameters结构体并设置其属性,包括漫反射颜色、镜面反射颜色和粗糙度。
根据预处理指令的条件,选择使用自定义光源颜色(model_lightColorHdr)还是默认光源颜色(czm_lightColorHdr)作为环境光颜色。
初始化color变量为输入材质的漫反射颜色。
如果存在法线属性(HAS_NORMALS条件满足),则调用czm_pbrLighting函数计算基本的PBR光照。该函数接受眼空间位置、法线、光线方向和光源颜色等参数,并返回光照颜色。
如果启用了基于图像的光照(USE_IBL_LIGHTING条件满足),则调用imageBasedLightingStage函数计算基于图像的光照。该函数接受眼空间位置、法线、光线方向、光源颜色和PBR参数等参数,并返回基于图像的光照颜色。将其加到color变量中。
将color乘以遮蔽贴图(inputMaterial.occlusion)并加上自发光贴图(inputMaterial.emissive)。
如果未启用HDR模式(HDR条件不满足),则应用ACES色调映射(czm_acesTonemapping)来处理颜色。
返回最终的颜色。『本文由“物图科技”原创』
因此,该函数根据材质属性和光照信息计算出最终的PBR光照颜色。
最简单的实现思路:
使用无光照模式,自定义computePbrLighting函数。
使用原色+原色*直射光计算后的颜色。
颜色相加会使颜色变亮
颜色相乘会使颜色变暗。
在模型原有材质的基础上,添加棱角(平行光计算后的光 叠加 模型原色)。
链接:http://124.70.129.134/VAPSEarthSdk/example/html/model.html
正常的实现思路:
通过CustomShader的uniform传入环境光颜色和强度,获取Cesium太阳光的颜色和强度。查找公式,计算物体受到平行光和环境光的影响后的混合颜色。
已知的问题:
cesium低版本的情况下,会出现丢失的情况。
本文由“物图科技”原创,其版权属物图科技所有。其他媒体、网站或个人未经授权严禁转载。
推荐阅读
2023/04/18
2023/04/27
2023/05/05
2023/04/07
2023/05/15