官方示例

Cesium Sandcastle

测试过程

1、修改示例,把customshader中的fragmentShaderText替换如下代码

void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material)
{
    //注意:下述颜色b值是0.1,不是1.0
    material.diffuse = vec3(0.0, 0.0, 0.1);

}

上述shader代码简单,就是给3dTiles一个颜色

预期结果: rgb(0, 0, 25)

实际结果: rgb(0, 0, 90)

问题分析

(以下分析基于Cesium 1.111.0版本源码

发现问题出在LightingStageFS.glsl中Line69行

因为在shader执行

color = czm_linearToSrgb(color);

所以导致颜色失真!

#ifdef HAS_POINT_CLOUD_COLOR_STYLE
// The colors resulting from point cloud styles are adjusted differently.
color = czm_gammaCorrect(color);
#elif !defined(HDR)
// If HDR is not enabled, the frame buffer stores sRGB colors rather than
// linear colors so the linear value must be converted.
color = czm_linearToSrgb(color);//这里是导致颜色不准确的原因!!
#endif

解决方案

方案1:

修改用户自己写的CustomShader

void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material)
{
  vec3 color=vec3(0.0, 0.0, 0.1);
  //使用czm_linearToSrgb反向操作————czm_srgbToLinear
  //为了代码的通用性,在最后使用下述代码,最好不在中间代码执行
  material.diffuse = czm_srgbToLinear(color);
}

注意:

lightingModel设置为Cesium.LightingModel.PBR的时候

这个解决方案并不成立

方案2:

在上述shader中,我们发现,如果定义了HDR,就不会执行下述代码

color = czm_linearToSrgb(color);

是不是就解决问题

我试了下述代码

viewer.scene.highDynamicRange = false;

确实可以shader中不走那段代码了,但是在后续的shader中,还是会改变颜色

这个后续再跟进

这个方案失败

原文地址:https://blog.csdn.net/wzwxwc1987/article/details/134719380

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_34450.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注