Cesium-CustomShader给3dtiles加贴图

这篇具有很好参考价值的文章主要介绍了Cesium-CustomShader给3dtiles加贴图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、需求

        Cesium加载3dtiles是非常高频的使用需求,但是对于用户自己处理过的3dtiles文件可能需要一些特效,这种时候仅仅依赖Cesium原生的渲染就无法达到因此必须拓展。

二、为什么是CustomShader

        为什么要做这个工作,可以看这个大佬的文章:https://www.cnblogs.com/HelsingWang/p/13531172.html

这里解释得很清楚虽然在Cesium中3dties是通过primitive的方式添加的:

var tileset = scene.primitives.add(new Cesium.Cesium3DTileset({
   url : 'http://localhost:8002/tilesets/Seattle/tileset.json',
   skipLevelOfDetail : true,
   baseScreenSpaceError : 1024,
   skipScreenSpaceErrorFactor : 16,
   skipLevels : 1,
   immediatelyLoadDesiredLevelOfDetail : false,
   loadSiblings : false,
   cullWithChildrenBounds : true
 });

但是这种添加不是同于一般primitive添加方式:可以直接在appearance属性中添加材质对象

scene.primitives.add(new Cesium.Primitive({
  geometryInstances : instance,
  appearance : new Cesium.EllipsoidSurfaceAppearance({
  material : Cesium.Material.fromType('Checkerboard')
  })
});

这种材质对象是广义的,除了上述这种预定义的材质,还可以使用Fabric来定义材质:

material: new Cesium.Material({
                                fabric: {
                                    uniforms: {
                                        image: url
                                    },
                                    source: ms
                                }
                            })

甚至可以使用source写shader。但是很遗憾,3dtiles不支持这样做。那么在Cesium 1.87之后提供了CustomShader方式来为3dtiles加shader;

三、怎么做

看一个customshader的例子:https://blog.csdn.net/weixin_45174000/article/details/129240933

这个大佬呢给出了我感觉流程最全的一个示例:

var customShader = new Cesium.CustomShader({
        // lightingModel: Cesium.LightingModel.UNLIT,
        //  lightingModel: Cesium.LightingModel.PBR,
        //设置变量,由顶点着色器传递给片元着色器
        varyings: {
          v_normalMC: Cesium.VaryingType.VEC3,
          v_st: Cesium.VaryingType.VEC3
        },
        //外部传给顶点着色器或者片元着色器
        uniforms: {
          u_texture: {
            value: new Cesium.TextureUniform({
              url: '/Assets/Images/buildWall.jpg'
            }),
            type: Cesium.UniformType.SAMPLER_2D
          },
           u_texture1: {
            value: new Cesium.TextureUniform({
              url: '/Assets/Images/buildWall1.jpg'
            }),
            type: Cesium.UniformType.SAMPLER_2D
          }
        },
       //贴纹理
       //顶点着色器
       //将法向量从顶点着色器设置变量传给片元着色器
        vertexShaderText: `
            void vertexMain(VertexInput vsInput, inout czm_modelVertexOutput vsOutput) {
                  v_normalMC = vsInput.attributes.normalMC;
                  v_st=vsInput.attributes.positionMC ;   
            }`,
           //片元着色器
         fragmentShaderText: `
           void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {
              vec3 positionMC = fsInput.attributes.positionMC;
              //这里是设置要贴图的图片的尺寸,设置小了会重复
              float width = 37.0;
              float height = 40.0;
              vec3 rgb;
              //这是是设置了屋顶的颜色,当和法向量平行时,就是屋顶,这里设置0.95,相当于垂直,建筑物四周开始贴图
              if (dot(vec3(0.0, 1.0, 0.0), v_normalMC) > 0.95) {
                material.diffuse = vec3(1.0, 0.0, 0.0);
              } else {
                float textureX = 0.0;
                float dotYAxis = dot(vec3(0.0, 0.0, 1.0), v_normalMC);
                // cos(45deg) 约等于 0.71,这里是建筑物四周的向量与法向量会大于四十五度夹角
                if (dotYAxis > 0.71 || dotYAxis < -0.71) {
                //x代表的是前后面
                  textureX = mod(positionMC.x, width) / width;
                } else {
                //z代表的是左右面
                  textureX = mod(positionMC.z, width) / width;
                }
                float textureY = mod(positionMC.y, height) / height;
                //我这里是根据建筑物高度贴了两张不同的图片
                if (positionMC.y > 30.0) {
                   rgb = texture2D(u_texture1, vec2(textureX, textureY)).rgb;       
                } else {
                   rgb = texture2D(u_texture, vec2(textureX, textureY)).rgb;
                }
                material.diffuse = rgb;
              }
          }` 
      })
       tilesets.customShader = customShader

然后如果想要了解其中的原理可以看看:Cesium3Dtilesets 使用customShader的解读以及泛光效果示例_3d_liuqing0.0-DevPress官方社区 (csdn.net)

 文章来源地址https://www.toymoban.com/news/detail-420622.html

到了这里,关于Cesium-CustomShader给3dtiles加贴图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cesium加载三维模型3dtiles

    目的:为避免跨域 输入cmd命令 python3 -m http.server 5500 http://127.0.0.1:5500/data/mars3d-max-shihua-3dtiles-master/tileset.json http://127.0.0.1:5500/cesium/cesium%E5%8A%A0%E8%BD%BD3dtile2.html

    2024年02月13日
    浏览(32)
  • Cesium入门之十:Cesium加载3DTiles数据

    3DTiles是一种面向网格化、可展示的大规模三维空间数据格式,专门为流式传输和渲染海量3D地理空间数据而设计的,用于存储和管理基于网格的三维模型数据。其数据结构基于B3DM和PNTS格式,可以支持多个级别的LOD,并使用Tilesets(瓦片集合)来组织和管理数据。3DTiles具有以

    2024年02月12日
    浏览(34)
  • Cesium clipping planes 3dtiles模型剖切 3dtiles模型贴地 vue代码

    使用Cesium的clippingPlanes实现对3dtiles模型的剖切效果。 相关官方文档地址:ClippingPlaneCollection、Cesium3DTileset 官方Demo地址:3D Tiles Clipping Planes 官方介绍:Cesium Feature Highlight: Clipping Planes 函数用于加载和显示3D Tiles模型以及剪切平面clipping planes。 在函数内部,首先创建了一个 Cesium.P

    2024年04月23日
    浏览(25)
  • 【Cesium】调整3dtiles模型的光照

    最近有个项目需要把掘进车放到巷道里面,加载出来的效果一片漆黑,看不清模型细节。  由于Cesium中材质没有自发光的设置,所以只能设置光源。 在网上查了一些代码,Cesium的光照效果的设置是通过webgl修改白膜的材质来实现的,由于巷道本身有贴图材质,用该方法实现的

    2024年02月11日
    浏览(40)
  • Cesium 中实现影像贴 3Dtiles

    Cesium 中我们经常使用的图层服务除了常见的遥感影像,还会包括一些矢量数据(如宗地范围、规划用地、道路信息等),这些图层服务通常经过 ArcGIS Server / GeoServer 之类的服务器渲染、切片供 Cesium 展示。 但在实际应用中会发现,这些图层服务的内容会被 3DTiles 遮盖(特别是渲染

    2024年02月08日
    浏览(25)
  • Cesium地图上加载3DTiles模型

    1,使用Blender创建模型: 官网下载Blender:https://www.blender.org/,在Github上下载Building Tools插件,通过编辑-偏好设置-插件-安装,导入压缩包使用,这个可以自己创建小房子,文件-导出为obj格式 2,将.obj转成3dtiles格式: 1,第一种方法通过加载本地文件展示: 1,github下载ObjTo3

    2024年02月03日
    浏览(29)
  • cesium加载3dtiles倾斜摄影数据

    效果如图 倾斜摄影数据的地址:百度网盘 请输入提取码 提取码:ztde 1.配置nginx,代理3dtiles倾斜摄影数据服务 如我的倾斜摄影数据放在D盘的某个文件夹里面,nginx可以这样配置    2.代码里面3dtiles的url指向倾斜摄影服务地址,同时配置一系列的参数 3dtiles的配置参数如下,可

    2024年02月11日
    浏览(29)
  • Cesium:3DTiles三维模型高度调整

            地形遮挡属性          如下两张图所示,输入高度值,根据需要调整模型高度。例如:针对近地面的管线数据,可能有一部分是埋在地下的,那么,如果开启了地形遮挡属性(即:设置为true,默认是false),那么,在进行场景渲染加载模型切片时,就会进行深度测

    2024年02月11日
    浏览(73)
  • cesium中3dtiles贴地问题设置

    当我们转换得到3dtiles格式数据后,将数据添加到cesium中:   模型可能出现以下不贴地的情况: 对于此类问题,解决办法参考如下: 模型定位: 修改后,模型贴地显示如下(设置不同的偏移量可以获得不同高度的模型): 

    2024年02月11日
    浏览(22)
  • Cesium 加载3Dtiles数据-最佳方法对比

            Cesium加载空间数据的方法有很多种,网络上关于3Dtiles数据集加载的废话连篇,看着就很无语。这里我本人直抒胸臆,简单介绍一下数据的加载方式。         先打开Cesium的深度检测的开关,也可以不打开。                完成以上步骤后,利用Cesium的readyPromi

    2024年02月11日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包