不用后处理更改Cesium3dtileset的颜色shader

本文介绍了一种针对GLTF模型中的shader进行修改的技术,通过定位到gl_FragColor并插入特定代码,使输出颜色变为红色。此方法适用于处理包含KHR_techniques_webgl扩展的GLTF文件,当shaders数量为2或大于2时,分别对第2个或第4个shader进行操作。

   ForEach.shader = function(gltf, handler)
    {
        if (hasExtension(gltf, 'KHR_techniques_webgl'))
        {
            
            if( gltf.extensions.KHR_techniques_webgl.shaders.length == 2 )
            {
                var numberi = gltf.extensions.KHR_techniques_webgl.shaders[1].extras._pipeline.source.lastIndexOf("gl_FragColor");
                var sky1 = gltf.extensions.KHR_techniques_webgl.shaders[1].extras._pipeline.source.substring(0, numberi);
                var sky2 = 'color = vec3(1.0, 0.0, 0.0);\n';
                var sky3 = gltf.extensions.KHR_techniques_webgl.shaders[1].extras._pipeline.source.substring( numberi);
                gltf.extensions.KHR_techniques_webgl.shaders[1].extras._pipeline.source = sky1 + sky2 + sky3;
            }
            else if( gltf.extensions.KHR_techniques_webgl.shaders.length > 2 )
            {
                var numberi = gltf.extensions.KHR_techniques_webgl.shaders[3].extras._pipeline.source.lastIndexOf("gl_FragColor");
                var sky1 = gltf.extensions.KHR_techniques_webgl.shaders[3].extras._pipeline.source.substring(0, numberi);
                var sky2 = 'color = vec3(1.0, 0.0, 0.0);\n';
                var sky3 = gltf.extensions.KHR_techniques_webgl.shaders[3].extras._pipeline.source.substring( numberi);
                gltf.extensions.KHR_techniques_webgl.shaders[3].extras._pipeline.source = sky1 + sky2 + sky3;
            }
            
            return ForEach.object(gltf.extensions.KHR_techniques_webgl.shaders, handler);
        }

        return ForEach.topLevel(gltf, 'shaders', handler);
    };

 

 

### 3D Tiles 与 Cesium3DTileset 简介 Cesium3DTilesetCesium 提供的一个类,用于加载和渲染 3D Tiles 数据集。3D Tiles 是一种开放的、可扩展的空间数据格式,专门用于流式传输和渲染大规模三维地理空间数据,包括建筑物(b3dm)、点云(pnts)、矢量数据(vctr)、实例化模型(i3dm)和复合瓦片(cmpt)[^2]。 ### Cesium3DTileset 的使用方法 Cesium3DTileset 可以通过 `Cesium.Cesium3DTileset.fromUrl` 方法加载 3D Tiles 数据集。该方法接收一个 JSON 文件的 URL,该 JSON 文件描述了整个瓦片集的结构和元数据。以下是一个典型的使用示例: ```javascript const tileset = await Cesium.Cesium3DTileset.fromUrl("../../public/tileset/building/tileset.json"); viewer.scene.primitives.add(tileset); ``` 在加载完成后,可以通过设置 `tileset.style` 属性来应用样式,例如根据高度对建筑物进行颜色编码: ```javascript tileset.style = new Cesium.Cesium3DTileStyle({ color: { conditions: [ ["${height} >= 7", "rgba(0, 149, 251, 0.3)"], ["${height} >= 6", "rgb(0, 149, 251, 0.3)"], ["${height} >= 5", "rgb(0, 149, 251, 0.3)"], ["${height} >= 4", "rgb(0, 149, 251, 0.3)"], ["${height} >= 3", "rgb(0, 149, 251, 0.3)"], ["${height} >= 2", "rgb(0, 149, 251, 0.3)"], ["${height} >= 1", "rgb(0, 149, 251, 0.3)"], ["true", "rgb(0, 149, 251, 0.3)"] ] } }); ``` ### Cesium3DTileset 的原理 Cesium3DTileset 类负责管理 3D Tiles 数据集的加载、渲染和样式应用。它通过一个层次结构来组织数据,主要包括以下几个类: - **Cesium3DTileset**: 管理整个 3D Tiles 数据集。 - **Cesium3DTile**: 表示单个瓦片,包含瓦片的元数据和内容。 - **Model3DTileContent**: 表示瓦片的内容,如建筑物、点云等。 - **Model**: 表示 3D 模型的具体内容。 - **ModelFeatureTable**: 包含模型的特征表,如颜色、高度等属性。 - **Cesium3DTileFeature**: 表示瓦片中的单个特征。 - **BatchTexture**: 用于存储批量纹理数据。 在加载过程中,Cesium3DTileset 会根据当前视图动态加载和卸载瓦片,以优化性能和内存使用。每个瓦片可以包含多个特征,这些特征可以通过样式进行可视化[^1]。 ### 3D Tiles 数据格式 3D Tiles 支持多种数据格式,包括: - **b3dm**: 建筑物数据格式,包含几何数据和元数据。 - **pnts**: 点云数据格式,用于表示大量点数据。 - **vctr**: 矢量数据格式,用于表示矢量图形。 - **i3dm**: 实例化模型数据格式,用于高效渲染多个相同模型。 - **cmpt**: 复合瓦片数据格式,用于组合多个瓦片。 ### Cesium3DTileset 的平移原理 Cesium3DTileset 提供了一个 `center` 属性,用于获取瓦片集的中心点坐标。该坐标是经过处理的笛卡尔坐标,可以通过转换得到 WGS84 坐标系下的经纬度。通过设置 `translation` 属性,可以对瓦片集进行平移操作,以调整其在场景中的位置[^4]。 ###
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值