Cesium材质——Material

简介:

Cesium.Material对象的目的,就是生成一段名称为czm_getMaterial的函数(示例代码如下),

这个czm_getMaterial函数,是shader代码,会被放到片元着色器中使用。

czm_material czm_getMaterial(czm_materialInput materialInput)
{...省略代码...return material;
}

Cesium.Material主要被MaterialProperty、Appearace这2个对象使用

1、创建自定义Material对象

创建一个自定义的material对象,主要是掌握fabric的结构就可以

fabric官方参考:

https://github.com/CesiumGS/cesium/wiki/Fabric

let materialPolylineFlow = new Cesium.Material({fabric: {type: "PolylineFlow",//自定义type类型uniforms: {color: new Cesium.Color(1.0, 0.0, 0.0, 1.0),speed: 4,percent: 0.1,gradient: 0.4,},source: fs,//自定义的着色器,也就是定义czm_getMaterial函数的地方},translucent: function (material) {return true;},
});

2、Material的复用

上述代码定义了一个type(类型)名为“PolylineFlow”的Material实例对象。

里面包含4个uniform变量、一段自定义的shader代码、还有控制透明度的函数

问题:如果我想复用这个material对象,该怎么做?

比如,我想声明一个一模一样的material效果,只是color为蓝色Cesium.Color.BLUE

我该怎么做?

方案1:复制上述所有代码

只是修改color的值

let materialPolylineFlowBlue = new Cesium.Material({fabric: {//type: "PolylineFlowBlue",//不能和上面的PolylineFlow同名(也可以不写这个值)uniforms: {color: new Cesium.Color(0.0, 0.0, 1.0, 1.0),//只是这里的值变了,其他都没变speed: 4,percent: 0.1,gradient: 0.4,},source: fs,},translucent: function (material) {return true;},
});

这个可行,就是重复代码太多

方案2:封装一个工具类

解决重复代码,第1个想到的就是自己封装一个类,把公共代码集中到一块

class util{static getMaterialByType(strTypeName,options){if(strTypeName=="PolylineFlow"){let {color=new Cesium.Color(1.0, 0.0, 0.0, 1.0),speed=4,percent=0.1,gradient=0.4}=options;//——————下述代码和之前基本一致——————let material = new Cesium.Material({fabric: {//type: "PolylineFlowBlue",//没必要再传入这个参数了uniforms: {color: color,speed: speed,percent: percent,gradient: gradient,},source: fs,},translucent: function (material) {return true;},});//——————上述代码和之前基本一致——————}else if(strTypeName=="otherType"){//其他类型的Material}}
}

这个也可行!

获取一个蓝色的Material,代码如下

let materialBlue=util.getMaterialByType("PolylineFlow",{color:Cesium.Color.BLUE
})
方案3:Cesium自己的方案

通过Cesium.Material._materialCache.addMaterial来注册一个type类型的Material

Cesium.Material.PolylineFlowType = "PolylineFlow";
Cesium.Material._materialCache.addMaterial(Cesium.Material.PolylineFlowType,{fabric: {type: Cesium.Material.PolylineFlowType,uniforms: {color: new Cesium.Color(1.0, 0.0, 0.0, 1.0),speed: 4,percent: 0.1,gradient: 0.4,},source: fs,},translucent: function (material) {return true;},},
);

之后,如果要复用这个PolylineFlow类型的Material

Cesium提供了2中方法

方法1:
let materialByNew = new Cesium.Material({fabric: {type: "PolylineFlow",uniforms: {color: new Cesium.Color(0.0, 0.0, 1.0, 1.0),},},
});

不推荐使用这个,假如type传入一个“非注册过”的material类型

不会报错,反而会进行“不完全注册”!

“不完全注册”是指

new Cesium.Material()的源码中,

虽然执行了Cesium.Material._materialCache.addMaterial()方法

但是,并不能复用!(可能是Cesium的bug)

方法2:
let materialByFrom = Cesium.Material.fromType("PolylineFlow", {color: new Cesium.Color(0.0, 1.0, 0.0, 1.0),
});

推荐使用这个,因为它就是一个纯粹的复用

fromType()的第1个参数,是要复用的material的type名称

如果传入的type值,不在materialCache中,则直接报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5 渲染管线 学习笔记

兰伯特 SSS为散射的意思 带Bias的可以根据距离自动切换mip的卷积值 而带Level的值mipmaps的定值 #define A8_SAMPLE_MASK .a 这样应该就很好理解了 这个只采样a通道 带Level的参考上面的 朝左上和右下进行模糊 带Bias参考上面

1114 Family Property (25)

This time, you are supposed to help us collect the data for family-owned property. Given each persons family members, and the estate(房产)info under his/her own name, we need to know the size of each family, and the average area and n…

canvas绘制仪表盘刻度盘

canvas画布可以实现在网页上绘制图形的方法,比如图表、图片处理、动画、游戏等。今天我们在vue模板下用canvas实现仪表盘的绘制。 对canvas不熟悉的同学可以先了解下canvas的API文档:canvas API中文网 - Canvas API中文文档首页地图 一、创建模板&#…

Docker 环境配置

官网 https://www.docker.com (opens new window)- Mac、Windows、Linux。 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Mac、Linux或Windows操作系统的机器上,也可以实…

Spring Boot 中实现自定义注解记录接口日志功能

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

【超详细实操内容】django的身份验证系统之限制用户访问的三种方式

目录 1、使用request.user.is_authenticated属性 2、装饰器login_required 3、LoginRequiredMixin类 通常情况下,网站都会对用户限制访问,例如,未登录的用户不可访问用户中心页面。Django框架中使用request.user.isauthenticated属性、装饰器loginrequired和LoginRequire…

scss配置全局变量报错[sass] Can‘t find stylesheet to import.

路径没有错误,使用别名即可 后又提示Deprecation Warning: Sass import rules are deprecated and will be removed in Dart Sass 3.0.0. 将import改为use 使用时在$前添加全局变量所在文件,即variable.

【Java 基础】-- TreeMap 和HashMap 的内存开销情况

在相同数据量的情况下,Java TreeMap 和 HashMap 的内存开销有所不同,这是由于它们底层数据结构的差异导致的。以下是两者内存开销的分析与比较: 1. 底层数据结构差异 1.1 HashMap HashMap 是基于哈希表实现的。每个键值对存储在一个桶中&am…

微信小程序实现二维码海报保存分享功能

首先在写这个二维码分享海报的时候试过很多方法,比如:canvas中的这个createCanvasContext创建上下文的方法,去网上一搜就是一大堆,但其实这个方法已经被废弃了。Canvas 实例,可通过 SelectorQuery 获取。这是绘制背景图…

基于Qlearning强化学习的机器人路线规划matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 训练过程 测试结果 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论…

9 RCC使用HSE、HSI配置时钟

一、时钟树 RCC:reset clock control,复位和时钟控制器。HSE是外部的高速时钟信号,可以由有源晶振或者无源晶振提供。如果使用HSE或者HSE经过PLL倍频之后的时钟作为系统时钟SYSCLK,当HSE故障时候,不仅HSE会被关闭,PLL…

认识数据结构之——排序

一、 插入排序: 直接插入排序(以排升序为例): 排序思想: 单趟:记录某个位置的值,一个一个和前面的值比较,碰到更大的就往后覆盖,碰到更小的或者相等的就结束,最后将记录的值插入到…

uniapp 微信小程序 功能入口

单行单独展示 效果图 html <view class"shopchoose flex jsb ac" click"routerTo(要跳转的页面)"><view class"flex ac"><image src"/static/dyd.png" mode"aspectFit" class"shopchooseimg"&g…

【集合】Java 8 - Stream API 17种常用操作与案例详解

文章目录 Java8 Stream API 17种常用操作与案例详解1. collect()&#xff1a;将流中的元素收集到集合中2. filter()&#xff1a;根据条件过滤流中的元素3. map()&#xff1a;元素映射为另一个值4. forEach()&#xff1a;对流中的元素执行操作5. flatMap()&#xff1a;将流中的元…

加入SFTP 用户------(小白篇 2)

以下是为 SFTP 添加一个新用户&#xff08;例如 newuser&#xff09;的完整步骤&#xff1a; 1.服务器上加入SFTP------(小白篇 1) 2.加入SFTP 用户------(小白篇 2) 3.代码加入SFTP JAVA —&#xff08;小白篇3&#xff09; 4.代码加入SFTP Python —&#xff08;小白篇4…

苍穹外卖-day05redis 缓存的学习

苍穹外卖-day05 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis店铺营业状态设置 学习目标 了解Redis的作用和安装过程 掌握Redis常用的数据类型 掌握Redis常用命令的使用 能够使用Spring Data Redis相关API操作Redis 能够开发店铺营业状态功能代码 功能实…

Linux之系统管理

一、相关命令 筛选 grep&#xff0c;可以用来进行筛选&#xff0c;例如对目录筛选课写成 # 过滤出带serv的 ls /usr/sbin | grep serv2. 对服务的操作 2.1 centos6版本 service 服务名 start|stop|restart|status # start&#xff1a;开启 # stop&#xff1a;停止 # restart…

什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap

在刚刚过去的 FlutterInProduction 活动里&#xff0c;Flutter 官方除了介绍「历史进程」和「用户案例」之外&#xff0c;也着重提及了未来相关的 roadmap &#xff0c;其中就有 3.27 里的 Swift Package Manager 、 Widget 实时预览 和 Dart 与 native 平台原生语言直接互操作…

vue.js滑动到顶便锁定位置

<template><div><div class"nav"></div><div class"searchBar" id"searchBar"><ul :class"searchBarFixed true ? isFixed :"> <li>区域<i class"iconfont icon-jiantouxia"…

Numpy基本操作

目录 1、生成数组的方法 1.1、生成0和1的数组 1.2、从现有数组生成 1.2.1、生成方式 1.3、生成固定范围的数组 1.4、生成随机数组 1.4.1、使用模块介绍 1.4.2、均匀分布 1.4.3、正态分布 1.4.4、正态分布创建方式 1、生成数组的方法 1.1、生成0和1的数组 import numpy…